home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / serveur.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  71KB  |  2,865 lines

  1. /*
  2.  * serveur.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * "Kernel"
  7.  * Routines de gestion du serveur
  8.  *
  9.  * History:
  10.  * --------
  11.  * 1993: fplanque: Created
  12.  */
  13.  
  14.  
  15.      #include "!OPTIONS.H"                /* Options de compilation */         
  16.     #define    THIS_FILE    "SERVEUR.C v1.01 - 07.95"
  17.           
  18.  
  19. /*
  20.  * System headers:
  21.  */
  22.     #include    <stdio.h>                    /* header standard */
  23.     #include <string.h>                    /* header tt de chaines */
  24.     #include    <stdlib.h>
  25.     #include <time.h>                        /* Conversion d'heure */
  26.    
  27.  
  28. /*
  29.  * Custom headers:
  30.  */
  31.  
  32.     #include "SPEC_PU.H"
  33.     #include "S_MALLOC.H"
  34.     #include "AESDEF.H"
  35.     #include "DTDIR_PU.H"
  36.     #include "DATPG_PU.H"
  37.     #include    "DESK_PU.H"    
  38.     #include    "DEBUG_PU.H"    
  39.     #include    "MAIN_PU.H"    
  40.     #include "ARBPG_PU.H"
  41.     #include "ATREE_PU.H"
  42.     #include "SRIAL_PU.H"
  43.     #include "DBSYS_PU.H"
  44.     #include "LISTS_PU.H"
  45.     #include    "SERV_PU.H"
  46.     #include    "LINE0_PU.H"
  47.     #include    "IOFLD_PU.H"
  48.     #include    "GETKB_PU.H"
  49.     #include    "DBINT_PU.H"        /* DB Interface */
  50.     #include    "ACOUNTPU.H"
  51.     #include    "ECRIM_PU.H"
  52.     #include    "LECTM_PU.H"
  53.     #include    "GENRC_PU.H"
  54.     #include    "DISPT_PU.H"
  55.     #include    "LISTD_PU.H"
  56.     #include "TERM_PU.H"
  57.     #include "TEXT_PU.H"
  58.     #include "WIN_PU.H"
  59.     #include "WINDR_PU.H"
  60.     #include "GEMEV_PU.H"
  61.     #include "OBJCT_PU.H"
  62.     #include "SERCOMPU.H"
  63.     #include "SVRFSLPU.H"
  64.     #include "GEMDIRPU.H"
  65.     #include "ARBGENPU.H"
  66.     #include "SVRDWLPU.H"
  67.         
  68. /*
  69.  * ------------------------ PROTOTYPES -------------------------
  70.  */
  71.  
  72.  
  73. /*
  74.  * PRIVate INTernal prototypes:
  75.  */
  76.     static    void    actions_atEndCnx( 
  77.                             VOIE *pVoie );
  78.     static    void    run_server( VOIE *voies );
  79.     static    BOOL    Action_IsLong(                /* Out: TRUE_1 si l'action peut s'effectuer en plusieurs tours de boucle ppale */
  80.                             int    n_action );        /* In:  Action demand‚e */
  81.     static    BOOL    handle_ENPG(
  82.                                 VOIE    *    pVoie_curr );        /* In: Voie concern‚e */
  83.     static    void    actions_atArbopgExit( 
  84.                             VOIE *pVoie );                /* In: Voie concern‚e */
  85. #if ACCEPT_REMOTE
  86.     static    void    try_connection( VOIE *pVoie_curr );
  87. #endif
  88.     static    int    enter_dir( VOIE *pVoie_curr, DATADIR *new_arbodir );
  89.     static    int    jmp_page( VOIE *pVoie_curr, char *new_arbo, int obligatoire );
  90.     static    int    affiche_ecran( VOIE *pVoie_curr, int fnct_ecran );
  91.     static    int    Serv_EnterDataPage( 
  92.                             VOIE     *    pVoie_curr,        /* In: Voie concern‚e */
  93.                             DATATYPE    DataType,        /* In: Type de donn‚es … charger */
  94.                             int        n_fnct );        /* In: Fonction Recherch‚e */
  95.  
  96.     static    int    sys_events( void );
  97.  
  98.  
  99.  
  100. /*
  101.  * ------------------------ VARIABLES -------------------------
  102.  */
  103.     
  104. /*
  105.  * External variables: 
  106.  */
  107.     /* 
  108.      * Ressource: 
  109.      */
  110.     extern    OBJECT    *G_menu_adr;                /* Ptr sur le MENU ! */
  111.     /* 
  112.      * Donn‚es: 
  113.      */
  114.     extern    DATAGROUP    *G_datagroups;            /* Groupes de donn‚es */
  115.     /* 
  116.      * Vdi: 
  117.      */
  118.     extern    int        G_ws_handle;                /* Handle virtual WorkStation VDI */
  119.  
  120.  
  121. /*
  122.  * Public variables: 
  123.  */
  124.     /* 
  125.      * Voies: 
  126.      */
  127.     VOIE    *    G_voies;                        /* Liste des voies */
  128.     int        G_nb_voies;                        /* Nombre de voies */
  129.     /* 
  130.      * Modes de fonctionnement: 
  131.      */
  132.     char        *G_mode[]=
  133.                     {
  134.                         "Normal",
  135.                         "Off-Line",
  136.                         "Test Loc"
  137.                     };
  138.     long        G_abrev_mode[]=
  139.                     {
  140.                         'NORM',
  141.                         'OFFL',
  142.                         'TEST'
  143.                     };
  144.     POPUP_ENTRY    G_Popup_Modes[]=
  145.                     {                    /* Popup de choix d'un mode de fonctionnement */
  146.                         "  Normal",            VMODE_NORMAL,
  147.                         "  Off-Line",        VMODE_OFFLINE,
  148.                         "  Test Local",    VMODE_TEST,
  149.                         NULL,                    0xFFFF
  150.                     };
  151.  
  152.     
  153. /*
  154.  * Private variables: 
  155.  */
  156.     static    DATAGROUP *    M_arbogroup;            /* Datagroup arbo */
  157.     static    DATAGROUP *    M_pecrangroup;            /* Datagroup pages-‚cran */
  158.     static    DATAGROUP *    M_dbasegroup;            /* Datagroup bases de donn‚es */
  159.     static    DATAGROUP *    M_pDataGroup_Texts;    /* Datagroup textes */
  160.     static    char         *    M_keyname[]=
  161.         {
  162.         /*    KEY_NONE,        */        "Aucune",            /* Aucune touche */
  163.         /*    KEY_SOMM,        */        "Sommaire",
  164.         /*    KEY_GUIDE,        */        "Guide",
  165.         /*    KEY_ANNUL,        */        "Annulation",
  166.         /*    KEY_CORREC,        */        "Correction",
  167.         /*    KEY_RETOUR,        */        "Retour",
  168.         /*    KEY_SUITE,        */        "Suite",
  169.         /*    KEY_REPET,        */        "R‚p‚tition",
  170.         /*    KEY_ENVOI,        */        "Envoi",
  171.         /*    KEY_FIN,            */        "Connexion/Fin",
  172.         /* ACTIONS,            */        NULL,
  173.         /* EVT_APPEL,        */        "  D‚tection d'un appel entrant (Minitel)",
  174.         /*    ACT_DISCONNECT */        "  D‚connexion"
  175.         };
  176.     /*
  177.      * Noms des actions:
  178.      */
  179.     char *    M_Tsz_ActionName[] =
  180.     {
  181.         "INIT",                /* La voie doit ˆtre initialis‚e */
  182.         "HALT",                /* Il y a une Kernel-Panic: le serv est stopp‚ */
  183.         "SLEP",                /* La voie n'est pas active */
  184.         "CNCT",                /* Etablissement Connexion en cours */
  185.         "DECO",                /* D‚connexion en cours */
  186.         "WAIT",                /* On est en attente d'action utilisateur */
  187.         "STRT",                /* D‚but d'une connexion */
  188.         "JUMP",                /* On est en phase de changement de page */
  189.         "ENPG",                /* On est en ENTER PAGE: effectue initialisations */    
  190.         "DISP",                /* On est en phase d'affichage … l'‚cran */
  191.         "OPDB",                /* Phase de recherche/ouverture base de donn‚es */
  192.         "OTXT",                /* Phase de recherche/ouverture texte */
  193.         "DDAT",                /* Phase d'affichage de donn‚es */
  194.         "DREC",                /* Phase d'affichage d'un nouveau message */
  195.         "DPAG",                /* Phase d'affichage d'une page de message */
  196.         "DWLD",                /* Download, Protocole USLTP en cours */
  197.         "EFLD",                /* On entre ds un champ */
  198.         "CPOS",                /* Repositionnement curseur pour continuer ‚dition */
  199.         "CLRF",                /* Clear Field (pour nouvelle ‚dition) */
  200.         "?01?",
  201.         "?02?"
  202.     };
  203.  
  204.  
  205. /*
  206.  * ------------------------ FUNCTIONS -------------------------
  207.  */
  208.  
  209.  
  210.  
  211. /*
  212.  * init_voies(-)
  213.  *
  214.  * Purpose:
  215.  * --------
  216.  * Init des voies utilis‚es (par d‚faut) lors du boot de stut one
  217.  * si aucune voie n'a ‚t‚ affect‚e en utilisant les fichiers .INI
  218.  *
  219.  * Algorythm:
  220.  * ----------  
  221.  * On ne cr‚‚e ici qu'une seule voie
  222.  *
  223.  * History:
  224.  * --------
  225.  * 1993: fplanque: Created
  226.  */
  227. void    init_voies( void )
  228. {
  229.     /*
  230.      * Pointeurs: 
  231.      */
  232.     VOIE    *pVoie_curr;        /* Voie en cours de cr‚ation: */
  233.  
  234.     /*
  235.      * Cr‚ation de la voie en m‚moire: 
  236.      */
  237.     pVoie_curr = Construct_Voie( );
  238.  
  239.     /*
  240.      * Initialisation g‚n‚rale: 
  241.      */
  242.     pVoie_curr -> no_voie = 1;                    /* Num‚ro de la voie */
  243.     pVoie_curr -> device = G_term_dev;        /* Port terminal */
  244.     pVoie_curr -> mode = VMODE_NORMAL;        /* Mode de fonctionnement */
  245.     pVoie_curr -> next = NULL;                    /* Pas d'autre voie (pour l'instant) */
  246.     voie_phase_init( pVoie_curr, TRUE_1 );    /* Met en phase INIT */
  247.  
  248.     /*
  249.      * Sauve ptr sur d‚but de la liste: 
  250.      */
  251.     G_voies = pVoie_curr;    
  252.  
  253.     G_nb_voies = 1;
  254. }
  255.  
  256.  
  257. /*
  258.  * Construct_Voie(-)
  259.  *
  260.  * Purpose:
  261.  * --------
  262.  * Constructeur du pseudo objet VOIE
  263.  *
  264.  * History:
  265.  * --------
  266.  * 21.08.94: fplanque: Created
  267.  */
  268. VOIE * Construct_Voie( void )        /* Out: Voie construite */
  269. {
  270.     /*
  271.      * Alloue m‚moire:
  272.      */
  273.     VOIE * pVoie_curr = (VOIE *) MALLOC( sizeof( VOIE ) );
  274.  
  275.     /*
  276.      * Init variables:
  277.      */
  278.     pVoie_curr -> state.n_speed = 15;    /* Vitesse courante inconnue */
  279.  
  280.     pVoie_curr -> pTCompRec_ptrs    = NULL;
  281.  
  282.     pVoie_curr -> pMsz_Path = NULL;            /* Pas de path courant */
  283.      pVoie_curr -> TpDirEnt  = NULL;            /* Pas de DIR charg‚ en RAM */
  284.      pVoie_curr -> nb_TableEnt  = 0;
  285.      pVoie_curr -> nb_DirEnt  = 0;
  286.  
  287.     pVoie_curr -> pIOField_ListIn    = NULL;    /* Pas de liste de champs d'entr‚e */
  288.  
  289.     pVoie_curr -> pIOField_CurrOut = NULL;    /* pas de champ de sortie (anti plantage si serv ne d‚marre pas) */
  290.  
  291.     pVoie_curr -> pMsz_Login        = NULL;        /* Pas de Pseudo */
  292.     pVoie_curr -> pMsz_FirstName    = NULL;        /* Pas de Pr‚nom */
  293.     pVoie_curr -> pMsz_LastName    = NULL;        /* Nom */
  294.  
  295.     pVoie_curr -> pMsz_VFile        = NULL;        /* Fichier selectionn‚ */
  296.  
  297.     return    pVoie_curr;
  298. }
  299.  
  300.  
  301.  
  302. /*
  303.  * voie_phase_init(-)
  304.  *
  305.  * Purpose:
  306.  * --------
  307.  * Init une voie: On la met en mode SLEEP
  308.  *
  309.  * History:
  310.  * --------
  311.  * 1993: fplanque: Created
  312.  * 17.05.94: La fonction en renverra plus rien.
  313.  */
  314. void    voie_phase_init( 
  315.             VOIE *voie, 
  316.             int stable )        /* In: !=0 si on veut que la voie soit stable */
  317. {
  318.     if( stable )
  319.     {    /* Init stable: */
  320.         voie -> action[ 0 ] .no = INIT;        /* La connexion doit ˆte initialis‚e */
  321.         voie -> action_head = 0;                /* index Action en cours sur la voie courante */
  322.         voie -> action_tail = 0;                /* Index de la deniere action a effectuer sur la voie courante */
  323.     }
  324.     else
  325.     {    /* Init instable: la moteur va sauter … l'action suivante qui sera INIT: */
  326.         voie -> action[ 0 ] .no = INIT;        /* Bidon, on le met pour s‚curit‚ */
  327.         voie -> action[ 1 ] .no = INIT;        /* La connexion doit ˆte initialis‚e */
  328.         voie -> action_head = 0;                /* index Action en cours sur la voie courante */
  329.         voie -> action_tail = 1;                /* Index de la deniere action a effectuer sur la voie courante */
  330.     }
  331.  
  332.     if( voie -> device > 0 )
  333.     {
  334.         FlushRXBuffer( voie -> device );
  335.     }
  336.  
  337. }
  338.  
  339.  
  340.  
  341. /*
  342.  * init_connexion(-)
  343.  *
  344.  * Purpose:
  345.  * --------
  346.  * Init une voie pour le d‚but d'une connexion
  347.  *
  348.  * History:
  349.  * --------
  350.  * fplanque: Created
  351.  * 17.05.94: fplanque: init des ptrs sur records en lecture / ReadLocks
  352.  * 21.08.94: fplanque: tient compte de pIOField_CurrIn
  353.  * 30.01.95: enlev‚ inits redondantes avec ENPG
  354.  */
  355. void    init_connexion( VOIE *pVoie_curr )
  356. {
  357.     VOIESTATE    state;
  358.  
  359.     /*
  360.      * Fixe dossier dans lequel on doit chercher les pages ecran:
  361.      * Pour l'instant: toujours dans le root: 
  362.      */
  363.     pVoie_curr -> pecrandir = M_pecrangroup -> root_dir;    /* ROOT */
  364.     /*
  365.      * Dossier pour les bases de donn‚es: 
  366.      */
  367.     pVoie_curr -> pDataDir_Datas = M_dbasegroup -> root_dir;    /* ROOT */
  368.     /*
  369.      * Dossier pour les textes: 
  370.      */
  371.     pVoie_curr -> pDataDir_Texts = M_pDataGroup_Texts -> root_dir;    /* ROOT */
  372.  
  373.     /* 
  374.      * Etats: 
  375.      */
  376.     state .log_modemcnx    = FALSE0;            /* Modem non connect‚ */
  377.     state .phys_modemcnx = FALSE0;            /* Modem non connect‚ */
  378.     pVoie_curr -> state = state;
  379.  
  380.     /*
  381.      * Pas de locks pour l'instant!
  382.      */
  383.     pVoie_curr -> pCRLstElt_1stRLock    = NULL;    /* Liste des readlocks */
  384.     pVoie_curr -> pCompRec_XLock            = NULL;    /* Enregistrement sur lequel on d‚tient un lock EXCLUSIF! */
  385.              
  386.     /* 
  387.      * Champs de saisie: 
  388.      * On doit mettre certains pointeurs … NULL pour ne pas
  389.      * que IsEditing r‚ponde TRUE_1 pendant la phase d'attente 
  390.      * de connexion!
  391.      *
  392.     * v‚rifier que pIOField_ListIn == NULL
  393.      */
  394.     pVoie_curr -> pIOField_CurrIn = NULL;
  395.     pVoie_curr -> curr_textline     = NULL;
  396.  
  397.     /*
  398.      * Entr‚es: 
  399.      */
  400.     pVoie_curr -> entete_seq        = NIL;        /* Pour l'instant on est pas dans une s‚quence */
  401.     pVoie_curr -> pro_compte        = 0;            /* On n'attend pas de codes de PRO 1, 2 ou 3 */
  402.     pVoie_curr -> csi                 = NIL;        /* Pour l'instant on est pas en s‚quence CSI */
  403.     pVoie_curr -> compose             = NIL;        /* Pour l'instant on est pas en s‚quence de composition de caractŠre */
  404.     pVoie_curr -> action_progress = APG_NONE;    /* Pas d'action en progress */
  405.  
  406.     /*
  407.      * ParamŠtres d'une page … une autre:
  408.      * Il n'y a pas de page pr‚c‚dente, donc pas de params transmis!:
  409.      */
  410.     pVoie_curr -> pDataPage_LockedDB_OUT = NULL;
  411.     pVoie_curr -> pCompRec_Locked_OUT = NULL;
  412.  
  413. }
  414.  
  415.  
  416.  
  417. /*
  418.  * update_voie_enFinCnx(-)
  419.  *
  420.  * Purpose:
  421.  * --------
  422.  * Effectue diverses actions n‚cessaires lors de la d‚connexion d'une voie
  423.  *
  424.  * Algorythm:
  425.  * ----------  
  426.  * Eteind curseur
  427.  * Execute actions necessaires lors de la sortie d'une page arbo.
  428.  *
  429.  * History:
  430.  * --------
  431.  * 17.05.94: fplanque: Created
  432.  * 13.07.95: fplanque: Remet les ptrs Login & Co sur NULL (corrige un BUG)
  433.  */
  434. void    actions_atEndCnx( 
  435.             VOIE *    pVoie_curr )
  436. {
  437.     /* 
  438.      * Efface curseur: 
  439.      */
  440.     csr_off( pVoie_curr -> device );
  441.  
  442.     /*
  443.      * effectue actions INDISPENSABLES lors de la sortie d'une page ARBO
  444.      */
  445.     actions_atArbopgExit( pVoie_curr );
  446.     
  447.     /*
  448.      * Init Variables sp‚cifiques … la connexion
  449.      */
  450.     /* TRACE2( "Freeing login:%s  1stName:%s", pVoie_curr -> pMsz_Login, pVoie_curr -> pMsz_FirstName ); */
  451.     free_String( pVoie_curr -> pMsz_Login );
  452.     pVoie_curr -> pMsz_Login = NULL;
  453.     
  454.     free_String( pVoie_curr -> pMsz_FirstName );
  455.     pVoie_curr -> pMsz_FirstName = NULL;
  456.     
  457.     free_String( pVoie_curr -> pMsz_LastName );
  458.     pVoie_curr -> pMsz_LastName = NULL;
  459.  
  460.     free_String( pVoie_curr -> pMsz_VFile );
  461.     pVoie_curr -> pMsz_VFile = NULL;
  462.  
  463.     /*
  464.      * Plus de path courant:
  465.      */
  466.     free_String( pVoie_curr -> pMsz_Path );
  467.     pVoie_curr -> pMsz_Path = NULL;
  468.  
  469. }
  470.  
  471.  
  472.  
  473. /*
  474.  * init_attente(-)
  475.  *
  476.  * Purpose:
  477.  * --------
  478.  * Init attente d'une connexion
  479.  *
  480.  * History:
  481.  * --------
  482.  * 1993: fplanque: Created
  483.  */
  484. void    init_attente( VOIE *pVoie_curr )
  485. {
  486.     /*
  487.      * Port: 
  488.      */
  489.     int    device = pVoie_curr -> device;
  490.         
  491.     /*
  492.      * Signale d‚but connexion … l'‚cran: 
  493.      */
  494.     add_textinf( pVoie_curr -> wi_params, "Attente de connexion" );
  495.  
  496.     /*
  497.      * Affiche attente … l'‚cran: 
  498.      */
  499.     full_cls( device );
  500.         
  501.     sprintf( G_tmp_buffer, 
  502.                 "\033FStut One - Voie \033G%03d\033F - "
  503.                     "Mode \033G%s\033F\r\n\r\n"
  504.                     "Attente de connexion.\r\n",
  505.                 pVoie_curr -> no_voie, G_mode[ pVoie_curr -> mode ] );
  506.     str_conout ( device, G_tmp_buffer );
  507.  
  508.     /*
  509.      * Passe en attente: 
  510.      */
  511.     register_action( pVoie_curr, SLEEP, 0, 0, NULL );        /* Demande attente */
  512.  
  513. }
  514.  
  515.  
  516.  
  517. /*
  518.  * dup_voies(-)
  519.  *
  520.  * Purpose:
  521.  * --------
  522.  * Duplique une liste de voies
  523.  *
  524.  * Notes:
  525.  * ------
  526.  * ATTENTION: ne copie pas les infos POINTEES par la voie
  527.  * Il ne faudra donc garder que l'une ou l'autre des copies!
  528.  *
  529.  * History:
  530.  * --------
  531.  * 1993: fplanque: Created
  532.  */
  533. VOIE    *    dup_voies( const VOIE *voie_srce )
  534. {
  535.     /*
  536.      * Pointeurs: 
  537.      */
  538.     VOIE     *first_voie_dest;            /* 1er elt de la liste destination */
  539.     VOIE     * *lastptr_to_next = &first_voie_dest;    /* Adr du dernier ptr sur le champ suivant */
  540.     VOIE     *voie_dest;                    /* Elt courant de la liste destination */
  541.  
  542.     /*
  543.      * Copie tous les champs: 
  544.      */
  545.     while( voie_srce != NULL )
  546.     {
  547.         /*
  548.          * Cr‚e nouveau champ 
  549.          */
  550.         voie_dest = Construct_Voie( );
  551.  
  552.         /*
  553.          * Copie les paramŠtres 
  554.          */
  555.         *voie_dest = *voie_srce;
  556.  
  557.         /*
  558.          * Lie ce champ au pr‚c‚dent: 
  559.          */
  560.         *lastptr_to_next = voie_dest;
  561.  
  562.         /*
  563.          * Nouvelle adr du dernier ptr sur champ suivant: 
  564.          */
  565.         lastptr_to_next = &(voie_dest -> next);
  566.                         
  567.         /*
  568.          * Passe au champ source suivant: 
  569.          */
  570.         voie_srce = voie_srce -> next;
  571.     }
  572.     /*
  573.      * Signale fin de la liste: 
  574.      */
  575.     *lastptr_to_next = NULL;
  576.  
  577.     /*
  578.      * Retourne ptr sur nlle liste: 
  579.      */
  580.     return    first_voie_dest;
  581. }
  582.  
  583.  
  584.  
  585. /*
  586.  * free_voies(-)
  587.  *
  588.  * Purpose:
  589.  * --------
  590.  * Efface 1 liste de params de voies de la m‚moire
  591.  *
  592.  * History:
  593.  * --------
  594.  * fplanque: Created
  595.  */
  596. void    free_voies( 
  597.             VOIE *pVoie_curr )
  598. {
  599.     VOIE *next_voie;
  600.     
  601.     while( pVoie_curr != NULL )
  602.     {
  603.         next_voie = pVoie_curr -> next;        /* Voie suivantz */
  604.         FREE( pVoie_curr );                        /* Efface la voie courante */
  605.         pVoie_curr = next_voie;                    /* Passe … la voie suivante */
  606.     }
  607. }
  608.  
  609.  
  610. /*
  611.  * Voie_LocalSpeed(-)
  612.  *
  613.  * Passe en vitesse locale
  614.  *
  615.  * 08.04.95: Created
  616.  */
  617. void    Voie_LocalSpeed(
  618.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  619. {
  620.     if( pVoie_curr -> state.n_speed != 0 )
  621.     {    /*
  622.           * Passe en 4800 bps
  623.          */                            
  624.         add_textinf( pVoie_curr -> wi_params, " Passage en vitesse locale (4800 bps)" );
  625.         MinitelPort_ChgeSpeed( pVoie_curr -> device, 4800 );
  626.         pVoie_curr -> state.n_speed = 0;
  627.     }
  628. }
  629.  
  630.  
  631. /*
  632.  * Voie_LineSpeed(-)
  633.  *
  634.  * Passe en vitesse "ligne"
  635.  *
  636.  * 08.04.95: Created
  637.  */
  638. void    Voie_LineSpeed(
  639.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  640. {
  641.     if( pVoie_curr -> state.n_speed != 1 )
  642.     {    /*
  643.           * Passe en 1200 bps
  644.          */                            
  645.         add_textinf( pVoie_curr -> wi_params, " Passage en vitesse ligne (1200 bps)" );
  646.         MinitelPort_ChgeSpeed( pVoie_curr -> device, 1200 );
  647.         pVoie_curr -> state.n_speed = 1;
  648.     }
  649. }
  650.  
  651.  
  652. /*
  653.  * lancer_serv(-)
  654.  *
  655.  * Purpose:
  656.  * --------
  657.  * Lancement du serveur
  658.  *
  659.  * History:
  660.  * --------
  661.  * 1993: fplanque: Created
  662.  * 26.12.94: le serv ne se lance pas si on a pas pu ouvrir les fenˆtres
  663.  * 08.02.95: curseur souris en croix
  664.  * 10.07.95: corrig‚ bug de lib‚ration de la voie en SMODE_TEST
  665.  */
  666. void    lancer_serv( 
  667.             int mode, 
  668.             int menu_title )
  669. {
  670.     VOIE    *    pVoie_FirstToHandle;    /* Liste des voies … g‚rer */
  671.     VOIE    *    pVoie_curr;                /* Voie en cours de traitement */
  672.     int        dev_offset;                /* Device offset voie courante */
  673.     BOOL        b_Error = FALSE0;        /* Pour l'instant pas d'erreur empˆchant le lancement du serv */
  674.  
  675.     /*
  676.      * D‚s‚lectionne entr‚e de menu s‚lectionn‚e: 
  677.      */
  678.     menu_tnormal(G_menu_adr, menu_title, 1);
  679.     /*
  680.      * Coupe le menu: 
  681.      */
  682.     enable_menu( G_menu_adr, FALSE0 );
  683.  
  684.     /*
  685.      * Fixe pointeurs: 
  686.      */
  687.     M_arbogroup             = find_datagroup_byType( DTYP_ARBO );    /* Datagroup arbo */
  688.     M_pecrangroup            = find_datagroup_byType( DTYP_PAGES );    /* Datagroup pages-‚cran */
  689.     M_dbasegroup            = find_datagroup_byType( DTYP_DATAS );    /* Datagroup bases de donn‚es */
  690.     M_pDataGroup_Texts    = find_datagroup_byType( DTYP_TEXTS );    /* Datagroup textes */
  691.  
  692.  
  693.     /*
  694.      * Init des voies: 
  695.      */
  696.     switch( mode )
  697.     {
  698.         case    SMODE_TEST:
  699.             /*
  700.              * Cr‚ation de la cnx logique: 
  701.              */
  702.             pVoie_FirstToHandle = Construct_Voie( );    
  703.             /*
  704.              * Initialisation: 
  705.              */
  706.             pVoie_FirstToHandle -> no_voie = 1;                    /* Num‚ro de la voie */
  707.             pVoie_FirstToHandle -> device = G_term_dev;            /* Port terminal */
  708.             pVoie_FirstToHandle -> mode = VMODE_TEST;            /* Mode de fonctionnement */
  709.             pVoie_FirstToHandle -> next = NULL;                    /* Pas d'autre voie (pour l'instant) */
  710.             voie_phase_init( pVoie_FirstToHandle, TRUE_1 );    /* Met cette voie en phase d'init */
  711.  
  712.             /*
  713.              * Cr‚e le titre: 
  714.              */
  715.             dev_offset = device_offset( pVoie_FirstToHandle -> device );
  716.             sprintf( G_tmp_buffer, " Test sur Voie locale (%s) ", 
  717.                             G_inst_drv_list[ dev_offset ] .name +2 );
  718.  
  719.             /*
  720.              * Ouvre la fenˆtre serveur: 
  721.              */
  722.             pVoie_FirstToHandle -> wi_params = ouvre_fenetre( CLASS_TEXT, TYP_TRACK,
  723.                                                             NULL,NULL,NULL, G_tmp_buffer );
  724.             if( pVoie_FirstToHandle -> wi_params == NULL )
  725.             {
  726.                 b_Error = TRUE_1;    /* On ne peut lancer le serv ds ces conditions! */
  727.             }
  728.         
  729.             /*
  730.              * Init Terminal: 
  731.              */
  732.             csr_off( pVoie_FirstToHandle -> device );    /* Eteind curseur */
  733.  
  734.             break;
  735.  
  736.         case    SMODE_NORMAL:
  737.             /*
  738.              * On va utiliser les voies allou‚es: 
  739.              */
  740.             pVoie_FirstToHandle = G_voies;        
  741.         
  742.             /*
  743.              * Init des voies: 
  744.              */
  745.             pVoie_curr = pVoie_FirstToHandle;
  746.             while( pVoie_curr != NULL )
  747.             {    /*
  748.                  * Tant qu'il y a une voie: 
  749.                  * Cr‚e le titre: 
  750.                  */
  751.                 dev_offset = device_offset( pVoie_curr -> device );
  752.                 sprintf( G_tmp_buffer, " Voie %03d (%s, %s) ", 
  753.                                 pVoie_curr -> no_voie,
  754.                                 G_inst_drv_list[ dev_offset ] .name +2,
  755.                                 G_mode[ pVoie_curr -> mode ] );
  756.                                 
  757.  
  758.                 /*
  759.                  * Ouvre la fenˆtre serveur: 
  760.                  */
  761.                 pVoie_curr -> wi_params = ouvre_fenetre( CLASS_TEXT, TYP_TRACK,
  762.                                                                     NULL,NULL,NULL, G_tmp_buffer );
  763.                 if( pVoie_curr -> wi_params == NULL )
  764.                 {
  765.                     b_Error = TRUE_1;    /* On ne peut lancer le serv ds ces conditions! */
  766.                     break;
  767.                 }
  768.  
  769.                 /*
  770.                  * Init Terminal: 
  771.                  */
  772.                 csr_off( pVoie_curr -> device );    /* Eteind curseur */
  773.  
  774.                 /*
  775.                  * Passe … la voie suivante: 
  776.                  */
  777.                 pVoie_curr = pVoie_curr -> next;
  778.  
  779.             }
  780.  
  781.             break;
  782.  
  783.         default:
  784.             ping();
  785.     }
  786.  
  787.     /* ------------------- */
  788.     /* Gestion du serveur: */
  789.     /* ------------------- */
  790.     if( ! b_Error )
  791.     {
  792.         graf_mouse( OUTLN_CROSS, 0 );        /* Change curseur souris */
  793.         run_server( pVoie_FirstToHandle );
  794.         graf_mouse( BUSYBEE, 0 );        /* Change curseur souris */
  795.     }
  796.  
  797.     /*
  798.      * Ferme les fenˆtres de tracking: 
  799.      */
  800.     pVoie_curr = pVoie_FirstToHandle;
  801.     while( pVoie_curr != NULL )
  802.     {    /*
  803.          * Tant qu'il y a une voie: 
  804.          */
  805.         if( pVoie_curr -> wi_params != NULL )
  806.         {    /*
  807.              * Si cette voie … une fenˆtre de tracking: 
  808.              */
  809.             ferme_fenetre( pVoie_curr -> wi_params, TRUE_1 );
  810.         }
  811.     
  812.         /*
  813.          * Passe … la voie suivante: 
  814.          */
  815.         pVoie_curr = pVoie_curr -> next;
  816.     }
  817.  
  818.     /*
  819.      * Si mode test: 
  820.      */        
  821.     if ( mode == SMODE_TEST )
  822.     {    /*
  823.          * Supprime la voie temporaire: 
  824.          */
  825.         FREE( pVoie_FirstToHandle );
  826.     }
  827.  
  828.     /*
  829.      * R‚-installe menu: 
  830.      */
  831.     enable_menu( G_menu_adr, TRUE_1 );
  832.  
  833. }
  834.  
  835.  
  836.  
  837. /*
  838.  * run_server(-)
  839.  *
  840.  * Purpose:
  841.  * --------
  842.  * Gestion du serveur
  843.  * KERNEL
  844.  *
  845.  * History:
  846.  * --------
  847.  * 1993: fplanque: Created
  848.  * 17.05.94: fplanque: demande ReadLock lors de l'ouverture database
  849.  * 17.05.94: Actions … effectuer lors d'un JUMP page ou d'une DECO sorties dans des fonctions independantes
  850.  * 17.05.94: Ex‚cute les actions pr‚c‚dentes sur toutes les voies connect‚s lorsque le serveur est interrompu par le sysop
  851.  * 24.09.94: correction bug lors d'une rub vide
  852.  * 19.12.94: gestion DPAG
  853.  * 26.12.94: gestion HALT
  854.  * 08.02.95: modifi‚ gestion timeslice overload
  855.  * 28.03.95: gestion csr on/off par WAIT
  856.  * 28.03.95: simplifi‚ code JUMP
  857.  * 13.07.95: ‚tendu DWLD
  858.  * 14.10.95: utilisation de Action_IsLong() et verification de la prochaine action a effectuer
  859.  * 14.10.95: une action JUMP provoque un saut obligatoire
  860.  */
  861. void    run_server( 
  862.             VOIE *    voies )
  863. {
  864.     #define    WATCH_CURRACTION    NO0
  865.  
  866.     /* 
  867.      * Variables: 
  868.      */
  869.     BOOL            break_serv    = FALSE0;    /* Le serveur tourne... */
  870.     BOOL            break_cnx    = FALSE0;    /* La cnx tourne... */
  871.  
  872. #if ACCEPT_REMOTE
  873.     int            ring_detect = FALSE0;    /* Pour l'instant on ne d‚tecte pas de sonnerie */
  874. #endif
  875.  
  876.     VOIE        *    pVoie_curr = voies;    /* Voie courante */
  877.     clock_t        curr_time;
  878.     clock_t        curr_timeslend;        /* Fin de la tranche de temps actuelle */
  879.     clock_t        curr_timeoverload;    /* Temps … partir duquel on est vraiment en OVERLOAD */
  880.     int            action_head;            /* Tete de la pile FIFO d'actions */
  881.     int            curraction;                /* Action en cours */
  882.     DATADIR    *    curr_datadir;            /* Datadir courant */
  883.     KEYCODE        curr_keypress;            /* Resultat de la saisie sur voie courante */
  884.     WIPARAMS    *    tracking_win;            /* Fenˆtre de tracking de la voie courante */
  885.  
  886.     /*
  887.      * Kernel Panic: ProblŠme au d‚marrage => HALT
  888.      * Pour l'instant le serv d‚marrae normalement:
  889.      */
  890.     BOOL            b_Halt = FALSE0;
  891.  
  892.     /* 
  893.      * Boucle principale de gestion des voies par timeslice: 
  894.      */    
  895.     do
  896.     {    /*
  897.          * Teste ‚vŠnements GEM: 
  898.          */
  899.         break_serv = sys_events();
  900.  
  901.         /*
  902.          * D‚termine fin de la tranche de temps 
  903.          * accord‚e au traitement de la voie courante: 
  904.          */
  905.         curr_timeslend = clock( ) + TIMESLICE;
  906.         curr_timeoverload = curr_timeslend + TIMESLICE;
  907.  
  908.         /*
  909.          * Fenˆtre de tracking de la voie courante: 
  910.          */
  911.         tracking_win = pVoie_curr -> wi_params;
  912.  
  913.         /*
  914.          * D‚termine action en cours sur la voie courante: 
  915.          */
  916.         action_head = pVoie_curr -> action_head;    /* Tˆte pile FIFO */
  917.         curraction = pVoie_curr -> action[ action_head ] .no;
  918.  
  919.         #if    WATCH_CURRACTION
  920.             printf( "\x1BY\x20\x5D%s", M_Tsz_ActionName[ curraction ] );
  921.         #endif
  922.  
  923.         /*
  924.          * ----------------------------------------------
  925.          * Boucle de traitement des actions sur UNE voie:
  926.          * ----------------------------------------------
  927.          */
  928.         do
  929.         {
  930.             /* 
  931.              * Selon action … effectuer: 
  932.              */
  933.             switch( curraction )
  934.             {
  935.                 case    INIT:
  936.                     /*
  937.                      * ---------------------------------
  938.                      * Phase d'initialisation de voie: 
  939.                      * ---------------------------------
  940.                      * ParamŠtre le terminal: 
  941.                      */
  942.                     param_local( pVoie_curr -> device );
  943.     
  944.                     /*
  945.                      * Initialisation de la connexion sur la voie: 
  946.                      */
  947.                     init_connexion( pVoie_curr );
  948.     
  949.                     /*
  950.                      * En fonction du mode de fonctionnement: 
  951.                      */
  952.                     switch( pVoie_curr -> mode )
  953.                     {
  954.                         case    VMODE_NORMAL:
  955.                         case    VMODE_OFFLINE:
  956.                             /*
  957.                              * Init de l'attente de connexion, passage en SLEEP: 
  958.                              */
  959.                             init_attente( pVoie_curr );
  960.                             break;
  961.                             
  962.                         case    VMODE_TEST:
  963.                             if( b_Halt )
  964.                             {
  965.                                 add_textinf( tracking_win, "Kernel Panic: Process Halted!" );
  966.                                 register_action( pVoie_curr, HALT, 0, 0, NULL );
  967.                                 break;
  968.                             }
  969.  
  970.                             /*
  971.                              * Signale d‚but connexion … l'‚cran: 
  972.                              */
  973.                             add_textinf( tracking_win, "Connexion Test (Off-Line)" );
  974.                             
  975.                             /*
  976.                              * D‚but de connexion: 
  977.                              */
  978.                             register_action( pVoie_curr, START, 0, 0, NULL );        /* Demande START cnx */
  979.     
  980.                             break;
  981.                     }
  982.                     break;
  983.  
  984.                 case    HALT:
  985.                     /*
  986.                      * La voie est arrˆt‚e:
  987.                      */
  988.                     break;
  989.  
  990.                 case    SLEEP:
  991.                 {    /*------------------------------------*/
  992.                     /* Phase d'attente d'appel/connexion: */
  993.                     /*------------------------------------*/
  994.                     #if ACCEPT_REMOTE
  995.                     /* -------------------------------- */
  996.                     /* Teste bouton droit de la souris: */
  997.                     /* -------------------------------- */
  998.                     if( pVoie_curr -> no_voie == VOIE_SOURIS )
  999.                     {    /*
  1000.                          * Si on est sur la voie no 1: 
  1001.                          */
  1002.                         int    bstate, x, y;
  1003.                         /*
  1004.                          * Teste ‚tat de la souris: 
  1005.                          */
  1006.                         vq_mouse( G_ws_handle, &bstate, &x, &y );
  1007.                         bstate &= 0x0002;    /* Garde juste le bit du bouton droit */
  1008.  
  1009.                         if( !ring_detect && bstate )
  1010.                         {    /*
  1011.                              * Si on vient d'appuyer sur "Feu": 
  1012.                              */
  1013.                             ring_detect = TRUE_1;        /* Sonnerie d‚tect‚e */
  1014.                             
  1015.                             /*
  1016.                              * Signale d‚tection: 
  1017.                              */
  1018.                             add_textinf( tracking_win, "  D‚tection Feu-Joystic 1 / Click droit-Souris" );
  1019.  
  1020.                             /*
  1021.                              * Envoi porteuse...: 
  1022.                              */
  1023.                             try_connection( pVoie_curr );
  1024.                             
  1025.                         }
  1026.                         else if( ring_detect && !bstate )
  1027.                         {    /*
  1028.                              * Si fin d'appui sur "Feu": 
  1029.                              */
  1030.                             ring_detect = FALSE0;        /* Plus de sonnerie */
  1031.                         }
  1032.                     }
  1033.                     #endif
  1034.                     
  1035.                     /* ----------------------- */
  1036.                     /* Attend codes en entr‚e: */
  1037.                     /* ----------------------- */
  1038.                     curr_keypress = get_keyboard( pVoie_curr );
  1039.                     /* printf("\nvoie=%d key=%d \r", pVoie_curr -> no_voie, curr_keypress ); */
  1040.  
  1041.                     if( curr_keypress != KEY_NONE    )
  1042.                     {    /*
  1043.                          * Affiche touche press‚e: 
  1044.                          */
  1045.                         affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  1046.  
  1047.                         switch( curr_keypress )
  1048.                         {
  1049.                             case    KEY_ENVOI:
  1050.                                 /*
  1051.                                  * Si on a appuy‚ sur ENVOI 
  1052.                                  * D‚but de connexion locale demand‚! : 
  1053.                                  * Signale d‚but connexion … l'‚cran: 
  1054.                                  */
  1055.                                 add_textinf( tracking_win, "Connexion Off-Line" );
  1056.                                 
  1057.                                 /*
  1058.                                  * D‚but de connexion: 
  1059.                                  */
  1060.                                 register_action( pVoie_curr, START, 0, 0, NULL );        /* Demande START cnx */
  1061.  
  1062.                                 break;
  1063.                                 
  1064.                             #if ACCEPT_REMOTE
  1065.                             case    EVT_APPEL:
  1066.                                 /*
  1067.                                  * D‚tection d'un appel:
  1068.                                  * Envoi porteuse...: 
  1069.                                  */
  1070.                                 try_connection( pVoie_curr );
  1071.  
  1072.                                 break;
  1073.                             #endif
  1074.                         }
  1075.                     }
  1076.                     break;
  1077.                 }
  1078.  
  1079.                 #if ACCEPT_REMOTE
  1080.                 case    CNCT:
  1081.                 {    /*
  1082.                       * ------------------------------------------------
  1083.                      * Phase d'attente d'‚tablissement de la connexion:
  1084.                      * ------------------------------------------------
  1085.                      * Attend codes en entr‚e: 
  1086.                      */
  1087.                     curr_keypress = get_keyboard( pVoie_curr );
  1088.  
  1089.                     /*
  1090.                      * Selon code re‡u: 
  1091.                      */
  1092.                     switch( curr_keypress )
  1093.                     {
  1094.                         case    KEY_NONE:
  1095.                         {    /*
  1096.                              * S'il ne se passe rien: 
  1097.                              * Selon o— on est et dans la proc‚dure de connexion: 
  1098.                              */
  1099.                             switch( pVoie_curr -> action_progress )
  1100.                             {
  1101.                                 case    APG_CNXSTART:
  1102.                                 case    APG_SPEED:
  1103.                                     if ( clock() >= pVoie_curr -> acq_timeout )
  1104.                                     {    /*
  1105.                                          * Si on d‚passe le timeout acquitements: 
  1106.                                          * Signale ‚chec connexion … l'‚cran: 
  1107.                                          */
  1108.                                         if( pVoie_curr -> action_progress == APG_CNXSTART )
  1109.                                         {
  1110.                                             add_textinf( tracking_win, 
  1111.                                                 "    Impossible de fixer la vitesse Modem (Timeout)" );
  1112.                                         }
  1113.                                         else
  1114.                                         {
  1115.                                             add_textinf( tracking_win,
  1116.                                                 "    Impossible d'envoyer une porteuse (Timeout)" );
  1117.                                         }
  1118.  
  1119.                                         /*
  1120.                                          * Reset de la vitesse:
  1121.                                          */                            
  1122.                                         Voie_LocalSpeed( pVoie_curr );
  1123.  
  1124.                                         /*
  1125.                                          * Init de l'attente d'une nouvelle connexion, passage en SLEEP: 
  1126.                                          */
  1127.                                         pVoie_curr -> action_progress = APG_NONE;        /* Plus de proc‚dure en cours */
  1128.                                         init_attente( pVoie_curr );
  1129.  
  1130.                                     }
  1131.                                     break;
  1132.  
  1133.                                 case    APG_PORTEUSE:
  1134.                                     if( clock() >= pVoie_curr -> key_timeout )
  1135.                                     {    /*
  1136.                                          * Si on d‚passe le timeout connexion: 
  1137.                                          */
  1138.         
  1139.                                         /*
  1140.                                          * Signale ‚chec connexion … l'‚cran: 
  1141.                                          */
  1142.                                         add_textinf( tracking_win, "    Pas de connexion (Timeout)" );
  1143.  
  1144.                                         /*
  1145.                                          * D‚connecte le Modem (Coupe la porteuse): 
  1146.                                          */
  1147.                                         deconnecte_modem( pVoie_curr -> device );
  1148.                                     
  1149.                                         /*
  1150.                                          * Reset de la vitesse:
  1151.                                          */                            
  1152.                                         Voie_LocalSpeed( pVoie_curr );
  1153.  
  1154.                                         /*
  1155.                                          * Init de l'attente d'une nouvelle connexion, passage en SLEEP: 
  1156.                                          */
  1157.                                         pVoie_curr -> action_progress = APG_NONE;        /* Plus de proc‚dure en cours */
  1158.                                         init_attente( pVoie_curr );
  1159.         
  1160.                                     }
  1161.                                     break;
  1162.                             
  1163.                                 default:
  1164.                                     signale( "Action-progress error" );
  1165.  
  1166.                                     /*
  1167.                                      * Reset de la vitesse:
  1168.                                      */                            
  1169.                                     Voie_LocalSpeed( pVoie_curr );
  1170.  
  1171.                                     /* 
  1172.                                      * Met la voie en phase d'initialisation: 
  1173.                                      */
  1174.                                     voie_phase_init( pVoie_curr, FALSE0 );
  1175.                                     action_head = pVoie_curr -> action_head;
  1176.                             }
  1177.                             
  1178.                             break;                            
  1179.                         
  1180.                         }
  1181.  
  1182.                         case    ACT_CONNECT:
  1183.                         {    /*
  1184.                              * Si la connexion a ‚t‚ ‚tablie: 
  1185.                              */
  1186.                             int    device = pVoie_curr -> device;
  1187.  
  1188.                             /*
  1189.                              * Signale d‚but connexion … l'‚cran: 
  1190.                              */
  1191.                             add_textinf( tracking_win, "Communication ‚tablie" );
  1192.  
  1193.                             /*
  1194.                              * Signale cnx ds flags: 
  1195.                              */
  1196.                             pVoie_curr -> state .log_modemcnx  = TRUE_1;    /* Modem connect‚ */
  1197.                             pVoie_curr -> state .phys_modemcnx = TRUE_1;    /* Modem connect‚ */
  1198.  
  1199.                             /*
  1200.                              * Affiche message: 
  1201.                              */
  1202.                             full_cls( device );
  1203.                             pos( device, 1, 0 );
  1204.                             str_conout ( device, 
  1205.                                                 STUT_CONNECTNAME "\n"
  1206.                                                 "Communication ‚tablie" );
  1207.                         
  1208.                             /*
  1209.                              * Debug info: 
  1210.                              */    
  1211.                             pos( device, 1, 5 );
  1212.                             sprintf( G_tmp_buffer, 
  1213.                                                 "\033FSystem Info:\r\n"
  1214.                                                 "Voie \033G%03d\033F\r\n"
  1215.                                                 "Port \033G%s\033F\r\n",
  1216.                                                 pVoie_curr -> no_voie, 
  1217.                                                 G_inst_drv_list[ device_offset( pVoie_curr -> device ) ] .name +2  );
  1218.                                                 str_conout ( device, G_tmp_buffer );
  1219.  
  1220.                             /*
  1221.                              * ParamŠtre le terminal: 
  1222.                              */
  1223.                             param_normal( pVoie_curr -> device );
  1224.  
  1225.  
  1226.                             /*
  1227.                              * D‚but de connexion: 
  1228.                              */
  1229.                             register_action( pVoie_curr, START, 0, 0, NULL );        /* Demande START cnx */
  1230.                             
  1231.                             break;
  1232.                         }
  1233.                         
  1234.                         case    ECHEC_CONNECT:
  1235.                         {    /*
  1236.                              * Si l'‚tablissement de la connexion a ‚chou‚: 
  1237.                              */
  1238.  
  1239.                             /* Signale ‚chec connexion … l'‚cran: */
  1240.                             add_textinf( tracking_win, "    Echec connexion" );
  1241.                         
  1242.                             /* Init de l'attente d'une nouvelle connexion, passage en SLEEP: */
  1243.                             init_attente( pVoie_curr );
  1244.  
  1245.                             break;
  1246.                         }
  1247.                         
  1248.                     }
  1249.                     break;
  1250.                 }
  1251.                 #endif
  1252.                                     
  1253.                 case    DECO:
  1254.                 {    /*
  1255.                      *---------------------------------
  1256.                      * Phase d'attente de d‚connexion: 
  1257.                      *---------------------------------
  1258.                      * Teste si le modem est d‚j… physiquement d‚connect‚: 
  1259.                      */
  1260.                     if ( !pVoie_curr -> state .phys_modemcnx )
  1261.                     {    /*
  1262.                           * On est d‚j… d‚connect‚: 
  1263.                           */
  1264.                         curr_keypress = ACT_DISCONNECT;
  1265.                     }
  1266.                     else
  1267.                     {    /* 
  1268.                          * S'il faut attendre la d‚co physique: 
  1269.                          * Attend codes en entr‚e: 
  1270.                          */
  1271.                         curr_keypress = get_keyboard( pVoie_curr );
  1272.                     }
  1273.                     
  1274.                     /* 
  1275.                      * Selon code re‡u: 
  1276.                      */
  1277.                     switch( curr_keypress )
  1278.                     {
  1279.                         case    KEY_NONE:
  1280.                             /* 
  1281.                              * S'il ne se passe rien: 
  1282.                              */
  1283.                             if ( clock() >= pVoie_curr -> acq_timeout )
  1284.                             {    /* 
  1285.                                  * Si on d‚passe le timeout acquitements: 
  1286.                                  */
  1287.  
  1288.                                 /* 
  1289.                                  * Signale ‚chec d‚connexion: 
  1290.                                  */
  1291.                                 add_textinf( tracking_win, "WARNING: La d‚connexion a ‚chou‚!" );
  1292.  
  1293.                                 /* 
  1294.                                  * Met la voie en init (sans passer par d'‚ventuelles autres actions): 
  1295.                                  */
  1296.                                 voie_phase_init( pVoie_curr, FALSE0 );
  1297.                                 action_head = pVoie_curr -> action_head;
  1298.  
  1299.                             }
  1300.                             break;
  1301.                         
  1302.                         case    ACT_DISCONNECT:
  1303.                             /* 
  1304.                              * Si le modem s'est physiquement d‚connect‚: 
  1305.                              * Signale fin de connexion … l'‚cran: 
  1306.                              */
  1307.                             add_textinf( tracking_win, "Connexion interrompue." );
  1308.                                                              
  1309.                             /*
  1310.                              * Reset de la vitesse:
  1311.                              */                            
  1312.                             Voie_LocalSpeed( pVoie_curr );
  1313.  
  1314.                             /* 
  1315.                              * Met la voie en init (sans passer par d'‚ventuelles autres actions): 
  1316.                              */
  1317.                             voie_phase_init( pVoie_curr, FALSE0 );
  1318.                             action_head = pVoie_curr -> action_head;
  1319.  
  1320.                             break;
  1321.                     
  1322.                     }
  1323.                     break;
  1324.                 }
  1325.                 
  1326.  
  1327.                 case    START:
  1328.                 {    /*------------------------*/
  1329.                     /* D‚but d'une connexion: */
  1330.                     /*------------------------*/
  1331.                     /*
  1332.                      * Met le clavier en minuscules: 
  1333.                      */
  1334.                     param_minitel( pVoie_curr -> device, pVoie_curr -> state .log_modemcnx );
  1335.                     
  1336.                     /*
  1337.                      * Rentre dans le nouveau dossier: 
  1338.                      */        
  1339.                     curr_datadir = M_arbogroup -> root_dir;    /* Dossier courant */
  1340.                     break_cnx = enter_dir( pVoie_curr, curr_datadir );        
  1341.                     if( break_cnx )
  1342.                     {    /*
  1343.                           * Impossible de lancer le serv!!
  1344.                           */
  1345.                         b_Halt = TRUE_1;
  1346.                     }
  1347.                     break;
  1348.                 }                    
  1349.  
  1350.  
  1351.                 case    WAIT:
  1352.                 {    /*
  1353.                      * ----------------------------------
  1354.                      * Phase d'attente d'action connect‚:
  1355.                      * ----------------------------------
  1356.                      * Teste le clavier du/(des) connect‚(s): 
  1357.                      */
  1358.                     curr_keypress = get_keyboard( pVoie_curr );
  1359.                     if( curr_keypress == KEY_NONE )
  1360.                     {
  1361.                         break;
  1362.                     }
  1363.  
  1364.                     /*
  1365.                      * Eteind curseur 
  1366.                      */
  1367.                     csr_off( pVoie_curr -> device );
  1368.                     /*
  1369.                      * R‚agit en fonction: 
  1370.                      */
  1371.                     switch( curr_keypress )
  1372.                     {
  1373.                         case    ACT_DISCONNECT:
  1374.                             /* 
  1375.                              * D‚connexion physique:
  1376.                              * Signale dans flags: 
  1377.                              */
  1378.                             pVoie_curr -> state .log_modemcnx = FALSE0;    /* Modem d‚connect‚ */
  1379.                             pVoie_curr -> state .phys_modemcnx = FALSE0;    /* Modem d‚connect‚ */
  1380.                             /* Continue.... */
  1381.  
  1382.                         case    KEY_FIN:
  1383.                             /* 
  1384.                              * Connexion/Fin: 
  1385.                              */
  1386.                             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  1387.  
  1388.                             /* 
  1389.                              * Fin (Interruption) de la connexion: 
  1390.                              */
  1391.                             break_cnx = TRUE_1;
  1392.  
  1393.                             break;
  1394.  
  1395.                         default:
  1396.                             switch( (pVoie_curr -> arboparams) -> fnct_no )
  1397.                             {    /*
  1398.                                  * Selon la fonction de la page arbo: 
  1399.                                  */
  1400.  
  1401.                                 case    FA_ECRI_MSG:
  1402.                                     /*
  1403.                                      * Ecriture d'un message 
  1404.                                      */
  1405.                                     keyaction_ecri_msg( curr_keypress, pVoie_curr );
  1406.                                     break;
  1407.                                 
  1408.                                 case    FA_LECT_MSG:
  1409.                                     /*
  1410.                                      * Lecture message:
  1411.                                      */
  1412.                                     LectMsg_KeyAction( curr_keypress, pVoie_curr );
  1413.                                     break;
  1414.                                     
  1415.                                 case    FA_DISP_TEXT:
  1416.                                     /*
  1417.                                      * Affichage d'un texte: 
  1418.                                      */
  1419.                                     DispText_KeyAction( curr_keypress, pVoie_curr );
  1420.                                     break;
  1421.                                     
  1422.                                 case    FA_ID:
  1423.                                     /*
  1424.                                      * Identification:
  1425.                                      */
  1426.                                     keyaction_Identification( curr_keypress, pVoie_curr ); 
  1427.                                     break;
  1428.     
  1429.                                 case    FA_NEW_ACCOUNT:
  1430.                                     /*
  1431.                                      * Cr‚ation d'un nouveau compte:
  1432.                                      */
  1433.                                     keyaction_NewAccount( curr_keypress, pVoie_curr ); 
  1434.                                     break;
  1435.  
  1436.                                 case    FA_LIST:
  1437.                                 case    FA_DIRECTORY:
  1438.                                     /*
  1439.                                      * Liste de messages:
  1440.                                      */
  1441.                                     ListMsg_KeyAction( curr_keypress, pVoie_curr ); 
  1442.                                     break;
  1443.  
  1444.                                 case    FA_FILESEL:
  1445.                                     /*
  1446.                                      * S‚lecteur de fichiers:
  1447.                                      */
  1448.                                     FileSel_KeyAction( curr_keypress, pVoie_curr ); 
  1449.                                     break;
  1450.                                     
  1451.                                 /* case    FA_MENU:            /* Menu */
  1452.                                 /* case    FA_DOWNLOAD:    /* T‚l‚chargement */
  1453.                                 default:                        /* Autres fonctions */
  1454.                                     keyaction_std( curr_keypress, pVoie_curr );
  1455.                             }
  1456.                     }
  1457.                     
  1458.                     /*
  1459.                      * Regarde s'il y a des actions en attente:
  1460.                      */
  1461.                     if( action_head == pVoie_curr -> action_tail
  1462.                         && GetEditMode( pVoie_curr ) == FIELDEDIT )
  1463.                     {    /*
  1464.                          * Pas de nouvelle action:
  1465.                          * On peut rallumer le curseur:
  1466.                          */
  1467.                         csr_on( pVoie_curr -> device );
  1468.                     }
  1469.                     break;
  1470.                 }
  1471.  
  1472.                 case    JUMP:
  1473.                 {    /*
  1474.                      * -------------------------------------------
  1475.                      * Si on est en phase de changement de page:
  1476.                      * -------------------------------------------
  1477.                      * Nom de la prochaine page:
  1478.                      */
  1479.                     char        *    new_page = (char *) (pVoie_curr -> action[ action_head ] .ptr1);        
  1480.                     int        jmp_result;
  1481.                     
  1482.                     /* 
  1483.                      * Saute … la page demand‚e: 
  1484.                      * Saut Obligatoire
  1485.                      */
  1486.                     add_textinf( tracking_win, " Saut … la page arbo: " );
  1487.                     jmp_result = jmp_page( pVoie_curr, new_page , TRUE_1 );    
  1488.  
  1489.                     /* 
  1490.                      * En fonction du r‚sultat: 
  1491.                      */
  1492.                     switch( jmp_result )
  1493.                     {
  1494.                         case    RAS0:        
  1495.                             /* 
  1496.                              * OK, rien a signaler:
  1497.                              * effectue actions INDISPENSABLES lors du changement de page
  1498.                              */
  1499.                             actions_atArbopgExit( pVoie_curr );
  1500.  
  1501.                             break;
  1502.                         
  1503.                         default:
  1504.                             /*
  1505.                              * Erreur: 
  1506.                              */        
  1507.                             break_cnx = TRUE_1;        /* Interruption de la connexion */
  1508.                             break;
  1509.                     }
  1510.                     break;                        
  1511.                 }
  1512.             
  1513.                 case    DISP:
  1514.                     /*
  1515.                      * -------------------------------------------
  1516.                      * Si on est en phase d'affichage sur l'‚cran:
  1517.                      * -------------------------------------------
  1518.                      * Affiche page VDT de FOND: 
  1519.                      */
  1520.                     break_cnx = affiche_ecran( pVoie_curr, pVoie_curr -> action[ action_head ] .int1 );
  1521.                     break;        
  1522.                     
  1523.                                     
  1524.                 case    ENPG:
  1525.                     /*
  1526.                      * ---------------------------------------------------------
  1527.                      * ENTER PAGE: initialisations … l'entr‚e sur une nlle page:
  1528.                      * ---------------------------------------------------------
  1529.                      * La seule action ayant d‚j… ‚t‚ faite sur la nouvelle page 
  1530.                      * aprŠs le JUMP est le DISP initial du fond d'‚cran
  1531.                      */
  1532.                     break_cnx = handle_ENPG( pVoie_curr );
  1533.                     break;
  1534.  
  1535.  
  1536.                 case    OPDB:
  1537.                 {    /*
  1538.                       * -----------------------------------------------
  1539.                      * Si on est en phase d'ouverture base de donn‚es:
  1540.                      * -----------------------------------------------
  1541.                      */
  1542.                     int    n_fnct = pVoie_curr -> action[ action_head ] .int1;
  1543.                     break_cnx = Serv_EnterDataPage( pVoie_curr, DTYP_DATAS, n_fnct );
  1544.  
  1545.                     if( !break_cnx )
  1546.                     {
  1547.                         switch( (pVoie_curr -> arboparams) -> fnct_no )
  1548.                         {
  1549.                             case    FA_LECT_MSG:    
  1550.                                 LectMsg_OPDB( pVoie_curr, n_fnct );
  1551.                                 break;
  1552.                             
  1553.                             case    FA_LIST:
  1554.                             case    FA_DIRECTORY:
  1555.                                 ListDB_OPDB( pVoie_curr );
  1556.                                 break;
  1557.                         }                    
  1558.                     }
  1559.                         
  1560.                     break;
  1561.                 }
  1562.  
  1563.  
  1564.                 case    OTXT:
  1565.                     /*
  1566.                       * ------------------------------------------
  1567.                      * Si on est en phase d'ouverture d'un texte:
  1568.                      * ------------------------------------------
  1569.                      */
  1570.                     break_cnx = Serv_EnterDataPage( pVoie_curr, DTYP_TEXTS, pVoie_curr -> action[ action_head ] .int1 );
  1571.                     break;
  1572.  
  1573.  
  1574.                 case    DDAT:
  1575.                     /*
  1576.                      * ------------------------------------------------------
  1577.                      * Si on est en phase d'affichage de donn‚es sur l'‚cran:
  1578.                      * ------------------------------------------------------
  1579.                      * Selon la fonction de la page arbo: 
  1580.                      */
  1581.                     switch( (pVoie_curr -> arboparams) -> fnct_no )
  1582.                     {
  1583.                         case    FA_ECRI_MSG:    
  1584.                             EcriMsg_DispData( pVoie_curr );
  1585.                             break;
  1586.  
  1587.                         case    FA_LECT_MSG:    
  1588.                             LectMsg_DispData( pVoie_curr );
  1589.                             break;
  1590.                             
  1591.                         case    FA_DISP_TEXT:    
  1592.                             DispText_DispData( pVoie_curr );
  1593.                             break;
  1594.                     
  1595.                         case    FA_LIST:
  1596.                         case    FA_DIRECTORY:
  1597.                             ListDB_DispData( pVoie_curr );
  1598.                             break;
  1599.                     
  1600.                         case    FA_FILESEL:
  1601.                             FileSel_DispData( pVoie_curr );
  1602.                             break;
  1603.                     
  1604.                         default:
  1605.                             signale( "Ne sait afficher les data pour ce type de page" );                        
  1606.                     }
  1607.                     break;
  1608.                 
  1609.     
  1610.                 case    DREC:
  1611.                     /*
  1612.                      * -------------------------------------------------
  1613.                      * Si on est en phase d'affichage d'un nouveau message
  1614.                      * -------------------------------------------------
  1615.                      */
  1616.                     switch( (pVoie_curr -> arboparams) -> fnct_no )
  1617.                     {
  1618.                         case    FA_LECT_MSG:    
  1619.                             LectMsg_DispMsg( pVoie_curr );
  1620.                             break;
  1621.  
  1622.                         case    FA_FILESEL:    
  1623.                             FileSel_DispRec( pVoie_curr );
  1624.                             break;
  1625.  
  1626.                         default:
  1627.                             signale( "Ne sait afficher les records pour ce type de page" );                        
  1628.                     }
  1629.                     break;
  1630.  
  1631.                 
  1632.                 case    DPAG:
  1633.                     /*
  1634.                      * -------------------------------------------------
  1635.                      * Si on est en phase d'affichage d'une page de MSG ou de texte
  1636.                      * -------------------------------------------------
  1637.                      */
  1638.                     switch( (pVoie_curr -> arboparams) -> fnct_no )
  1639.                     {
  1640.                         case    FA_LECT_MSG:    
  1641.                         case    FA_DISP_TEXT:    
  1642.                             Generic_DispPage( pVoie_curr );
  1643.                             break;
  1644.                     
  1645.                         case    FA_LIST:
  1646.                         case    FA_DIRECTORY:
  1647.                             ListDB_DispPage( pVoie_curr );
  1648.                             break;
  1649.                     
  1650.                         case    FA_FILESEL:
  1651.                             FileSel_DispPage( pVoie_curr );
  1652.                             break;
  1653.                     
  1654.                         default:
  1655.                             signale( "Ne sait afficher la page pour ce type arbo" );                        
  1656.                     }
  1657.                     break;
  1658.  
  1659.                 case    DWLD:
  1660.                     /*
  1661.                      * -----------------------------------------------
  1662.                      * Si on est en train de transmettre des fichiers:
  1663.                      * -----------------------------------------------
  1664.                      */
  1665.                     if( DownLoad_USLTP( pVoie_curr ) == TRUE_1 )
  1666.                     {    /*
  1667.                          * Signale fin de connexion:
  1668.                          */
  1669.                         break_cnx = TRUE_1;
  1670.                     }
  1671.                     break;            
  1672.  
  1673.                     
  1674.                 case    EFLD:
  1675.                     /*
  1676.                      * On entre ds un champ:
  1677.                      */
  1678.                     break_cnx = start_fieldedit( pVoie_curr, pVoie_curr -> action[ action_head ] .int1, pVoie_curr -> action[ action_head ] .ptr1 );
  1679.  
  1680.                     /*
  1681.                      * Place curseur: 
  1682.                      */
  1683.                     place_csr( pVoie_curr );
  1684.  
  1685.                     break;            
  1686.  
  1687.                 
  1688.                 case    CPOS:
  1689.                     /*
  1690.                      * ------------------------------------------------------------
  1691.                      * S'il faut repositionner le curseur pour continuer l'‚dition:
  1692.                      * ------------------------------------------------------------
  1693.                      * Positionne curseur: 
  1694.                      */
  1695.                     place_csr( pVoie_curr );
  1696.  
  1697.                     break;            
  1698.                 
  1699.                 
  1700.                 case    CLRF:
  1701.                     /*
  1702.                      * -----------------------------------------------------------
  1703.                      * On a demand‚ un Clear Field sur un certain champ de saisie:
  1704.                      * (utilis‚ par exemple, si on attend une NOUVELLE saisie)
  1705.                      * -----------------------------------------------------------
  1706.                      */
  1707.                     InField_Clear( pVoie_curr, pVoie_curr -> action[ action_head ] .ptr1 );
  1708.                     break;
  1709.  
  1710.  
  1711.                 default:
  1712.                     ping();
  1713.                     TRACE1("Action inconnue: %d", curraction);
  1714.             }
  1715.  
  1716.  
  1717.             if( ! break_cnx )
  1718.             { /*
  1719.                  * V‚rifie qu'on sait quelle action on va effectuer ensuite:
  1720.                  */            
  1721.                 if( action_head == pVoie_curr -> action_tail
  1722.                     && Action_IsLong( curraction ) == FALSE )
  1723.                 {    /*
  1724.                      * Si on ‚tait sur une action courte et qu'il n'y a pas
  1725.                      * d'action suivante, c'est qu'il y a un serieux probleme!
  1726.                      */
  1727.                     add_textinf( pVoie_curr -> wi_params, "ERREUR: Plus aucune action … effectuer!" );
  1728.                     ping();
  1729.                     break_cnx = TRUE_1;
  1730.                 }
  1731.             }
  1732.         
  1733.             /* 
  1734.              * Teste si la connexion a ‚t‚ interrompue:
  1735.              * Sinon, teste s'il faut passer … l'action suivante: 
  1736.              */
  1737.             if( break_cnx )
  1738.             {    /*
  1739.                 * --------------------
  1740.                  * Fin d'une connexion:
  1741.                  * --------------------
  1742.                  * Effectue toutes les actions n‚cessaires
  1743.                  * en fin de connexion:
  1744.                  */
  1745.                 actions_atEndCnx( pVoie_curr );
  1746.                  
  1747.                 /*
  1748.                  * Teste si on a d‚j… demand‚ la d‚connexion du modem: 
  1749.                  */
  1750.                 if( pVoie_curr -> state .log_modemcnx )
  1751.                 {    /*
  1752.                      * Si on a pas encore d‚connect‚: 
  1753.                      * D‚connexion: 
  1754.                      */
  1755.                     deconnecte_modem( pVoie_curr-> device );
  1756.                     /*
  1757.                      * Signale dans state: 
  1758.                      */
  1759.                     pVoie_curr -> state .log_modemcnx = FALSE0;    /* Logiquement, le modem est maintenant d‚connect‚ */
  1760.                 }
  1761.  
  1762.                 /* 
  1763.                  * Fixe ‚ch‚ance timeout de d‚connexion: 
  1764.                  */
  1765.                 pVoie_curr -> acq_timeout = clock( ) + ACQ_TIMEOUT;
  1766.                 
  1767.                 /* 
  1768.                  * Met la voie en attente imm‚diate de d‚co physique: 
  1769.                  */
  1770.                 pVoie_curr -> action[ 0 ] .no    = DECO;    /* Action en cours */
  1771.                 pVoie_curr -> action_head         = 0;        /* index Action en cours sur la voie courante */
  1772.                 pVoie_curr -> action_tail         = 0;        /* Index de la deniere action a effectuer sur la voie courante */
  1773.                 curraction = DECO;                            /* Action en cours */
  1774.                 action_head = 0;                                /* Index action en cours */
  1775.  
  1776.                 /* 
  1777.                  * On remet le flag de fin de cnx … 0 pour la suite (sinon il y aurait d‚connexion en chaine) 
  1778.                  */
  1779.                 break_cnx = FALSE0;                                                        
  1780.  
  1781.             }
  1782.             else if( action_head != pVoie_curr -> action_tail )
  1783.             {    /*
  1784.                  *    ---------------------------- 
  1785.                  * Si on est pas sur la deniŠre action de la tasklist
  1786.                  * (auquel cas, il vaut mieux que cette action soit un WAIT
  1787.                  *  ou un truc similaire!!!) :
  1788.                  * Passage … l'action suivante:
  1789.                  *    ---------------------------- 
  1790.                  */
  1791.                 if ( action_head == NB_ACTS_MAX-1 )
  1792.                 {
  1793.                     action_head = 0;
  1794.                 }
  1795.                 else
  1796.                 {
  1797.                     action_head++;
  1798.                 }
  1799.                 /*
  1800.                  * Sauve index action en cours sur la voie courante: 
  1801.                  */
  1802.                 pVoie_curr -> action_head = action_head;
  1803.             
  1804.                 /*
  1805.                  * D‚termine prochaine action … ‚x‚cuter: 
  1806.                  */
  1807.                 curraction = pVoie_curr -> action[ action_head ] .no;
  1808.                 #if    WATCH_CURRACTION
  1809.                     printf( "\x1BY\x20\x5D%s", M_Tsz_ActionName[ curraction ] );
  1810.                 #endif
  1811.             }
  1812.     
  1813.             /* 
  1814.              * Contr“le dur‚e de traitement de la voie courante: 
  1815.              */
  1816.             curr_time = clock();
  1817.  
  1818.             if( curr_time >= curr_timeoverload )
  1819.             {    /*
  1820.                  * Overload!
  1821.                  */
  1822.                 add_textinf( tracking_win, "Info: TIMESLICE OVERLOAD!" );
  1823.             
  1824.                 /* 
  1825.                  * Interrompt le traitement de la voie courante 
  1826.                  * et passe … la suivante 
  1827.                  */
  1828.                 break;                                        /* ################## */
  1829.             }
  1830.  
  1831.             if( curr_time >= curr_timeslend )
  1832.             {
  1833.                 /* 
  1834.                  * Interrompt le traitement de la voie courante 
  1835.                  * et passe … la suivante 
  1836.                  */
  1837.                 break;                                        /* ################## */
  1838.             }
  1839.             
  1840.         }    /* Fin de la boucle d'‚x‚cution des action de LA VOIE COURANTE */            
  1841.         while( Action_IsLong( curraction ) == FALSE
  1842.                 &&    curraction != INIT );    /* ou reinitialisation (c'est pas hyper press‚) */
  1843.  
  1844.         /*
  1845.          * ---------------------------
  1846.          * Passage … la voie suivante:
  1847.          * ---------------------------
  1848.          */    
  1849.         /* Suggest: on pourrait optimiser en faisant une liste des voies cyclique */
  1850.         if ( pVoie_curr -> next != NULL )
  1851.         {    /*
  1852.              * S'il y a une voie aprŠs: 
  1853.              */
  1854.             pVoie_curr = pVoie_curr -> next;    /* Passe … la voie suivante */
  1855.         }
  1856.         else
  1857.         {    /*
  1858.              * Si c'‚tait la derniŠre voie: 
  1859.              */
  1860.             pVoie_curr = voies;                    /* Revient … la premiŠre voie */
  1861.         }
  1862.                     
  1863.     }    /* Fin de la boucle de gestion des voies par timeslices */
  1864.     while( break_serv == FALSE0 );
  1865.  
  1866.     /* 
  1867.      * On a choisi d'interrompre le serveur:
  1868.      * D‚connexion des voies qui seraient encore connect‚es: 
  1869.      */
  1870.     for( 
  1871.         pVoie_curr = voies; 
  1872.         pVoie_curr != NULL; 
  1873.         pVoie_curr = pVoie_curr -> next )
  1874.     {
  1875.  
  1876.         /*
  1877.          * Teste si la voie est connect‚e:
  1878.          */
  1879.         if( pVoie_curr -> action[ pVoie_curr -> action_head ] .no != SLEEP )
  1880.         {    /* 
  1881.              * Si la voie est connect‚e
  1882.              *
  1883.              * PROVISOIRE: Faut t'il d‚connecter?
  1884.              *   et que faire si curraction= CNCT, DECO, INIT... ? (phases critiques)
  1885.              */
  1886.              
  1887.             /* printf( "\nPseudo d‚connexion de la voie %d    ", pVoie_curr -> no_voie ); */
  1888.              
  1889.             /*
  1890.              * Effectue les actions n‚cessaires lors d'une d‚connexion:
  1891.              */
  1892.             actions_atEndCnx( pVoie_curr );
  1893.         }     
  1894.  
  1895.         /* 
  1896.          * Met la voie en phase d'initialisation INIT: 
  1897.          */
  1898.         voie_phase_init( pVoie_curr, TRUE_1 );
  1899.     
  1900.     }
  1901.  
  1902.     #undef    WATCH_CURRACTION
  1903. }
  1904.  
  1905. /*
  1906.  * Action_IsLong(-)
  1907.  *
  1908.  * Dit si l'action peut s'effectuer en plusieurs tours de boucle ppale
  1909.  *
  1910.  * 14.10.95: fplanque: Created
  1911.  */
  1912. BOOL    Action_IsLong(                /* Out: TRUE_1 si l'action peut s'effectuer en plusieurs tours de boucle ppale */
  1913.             int    n_action )        /* In:  Action demand‚e */
  1914. {
  1915.     switch( n_action )
  1916.     {
  1917.         case    WAIT:        /* attente action */
  1918.         case    DWLD:        /* ou download en cours */
  1919.         case    HALT:        /* ou Voie arrˆt‚e: ya rien a faire */
  1920.         case    SLEEP:    /* ou attente demande connexion */
  1921.         case    CNCT:        /* ou attente cnx ‚tablie */
  1922.         case    DECO:        /* ou attente achevement d‚co physique */
  1923.             return    TRUE_1;
  1924.     }
  1925.     
  1926.     return    FALSE0;
  1927. }
  1928.  
  1929. /*
  1930.  * actions_atArbopgExit(-)
  1931.  *
  1932.  * Purpose:
  1933.  * --------
  1934.  * Effectue certaines actions
  1935.  * lors de la sortie d'une page arbo
  1936.  * cas lors d'un JUMP ou lors d'une DECO
  1937.  *
  1938.  * Algorythm:
  1939.  * ----------  
  1940.  * Si n‚cessaire, effectue les actions suivantes:
  1941.  *        - Efface zones de saisie texte courantes
  1942.  *        - Release Locks de lecture et oublie record courant
  1943.  *
  1944.  * Notes:
  1945.  * ------
  1946.  * ATTENTION: la page arbo signal‚e dans pVoie_curr peut (JUMP) ou non (DECO)
  1947.  * d‚j… contenir la page suivante … celle dont on sort. 
  1948.  *
  1949.  * History:
  1950.  * --------
  1951.  * 17.05.94: fplanque: Created
  1952.  * 21.08.94: fplanque: libŠre maintenant LISTE de INFIELDs
  1953.  * 18.12.94: fplanque: appelle maintenant IOFieldList_Destruct()
  1954.  * 19.12.94: efface champ de sortie courant
  1955.  * 30.01.95: efface tableau de ptrs sur records accessibles
  1956.  */
  1957. void    actions_atArbopgExit( 
  1958.             VOIE *    pVoie_curr )                /* In: Voie concern‚e */
  1959. {
  1960.     /*
  1961.      *    Efface zones d'‚dition courantes: 
  1962.      */
  1963.     IOFieldList_Destruct( pVoie_curr -> pIOField_ListIn );
  1964.     pVoie_curr -> pIOField_ListIn = NULL;    /* Plus de liste de champs d'entr‚e */
  1965.     pVoie_curr -> pIOField_CurrIn = NULL;
  1966.     pVoie_curr -> curr_textline = NULL;    /* Plus de ligne en cours d'‚dition */
  1967.  
  1968.  
  1969.     /*
  1970.      * Efface texte formatt‚ courament affich‚:
  1971.      */
  1972.     IOFieldList_Destruct( pVoie_curr -> pIOField_CurrOut );
  1973.     pVoie_curr -> pIOField_CurrOut = NULL;
  1974.     
  1975.  
  1976.     /*
  1977.      * Efface tableau de pointeurs vers records accessibles:
  1978.      */
  1979.     if( pVoie_curr -> pTCompRec_ptrs != NULL )
  1980.     {
  1981.         FREE( pVoie_curr -> pTCompRec_ptrs );
  1982.         pVoie_curr -> pTCompRec_ptrs    = NULL;
  1983.     }
  1984.     
  1985.     
  1986.     /*
  1987.      * ---------------------------------------------------
  1988.      * Release des locks de lecture et d'‚criture dans DB:
  1989.      * ---------------------------------------------------
  1990.      */
  1991.     DBInt_ReleaseAllLocks( pVoie_curr );
  1992.  
  1993.  
  1994.     /*
  1995.      * Plus de DB ouverte:
  1996.      */
  1997.     pVoie_curr -> database = NULL;
  1998.                         
  1999.  
  2000.     /*
  2001.      * Plus de texte ouvert:
  2002.      */
  2003.     pVoie_curr -> pDataPage_OpenText = NULL;
  2004.     
  2005.     
  2006.     /*
  2007.      * Efface le directory charg‚ en m‚moire:
  2008.      */
  2009.      Dir_Forget( pVoie_curr -> TpDirEnt, pVoie_curr -> nb_DirEnt );
  2010.      pVoie_curr -> TpDirEnt = NULL;
  2011.      pVoie_curr -> nb_TableEnt = 0;
  2012.      pVoie_curr -> nb_DirEnt = 0;
  2013.  
  2014. }
  2015.  
  2016.  
  2017. /*
  2018.  * handle_ENPG(-)
  2019.  *
  2020.  * Purpose:
  2021.  * --------
  2022.  * Traitrement des initialisations ENTER PAGE
  2023.  *
  2024.  * History:
  2025.  * --------
  2026.  * 13.11.94: fplanque: Created
  2027.  * 27.11.94: R‚‚criture quasi totale avec nouvelles fonctions
  2028.  * 02.12.94: essaie tjs de se placer sur le 1er champ de saisie activ‚ de la page
  2029.  * 13.04.95: Download
  2030.  */
  2031. BOOL    handle_ENPG(                        /* Out: True_1 s'il faut arrˆter la connexion */
  2032.             VOIE    *    pVoie_curr )        /* In:  Voie concern‚e */
  2033. {    
  2034.     int    n_PgFnct = (pVoie_curr -> arboparams) -> fnct_no;
  2035.  
  2036.     /*
  2037.      * Init saisie: 
  2038.      * A priori: pas de champ de saisie/sortie:
  2039.      */
  2040.     pVoie_curr -> pIOField_CurrOut = NULL;
  2041.     pVoie_curr -> pIOField_CurrIn  = NULL;
  2042.     pVoie_curr -> curr_textline      = NULL;        /* Pas de ligne buffer en cours d'‚dition */
  2043.     /*
  2044.      * pas de champ en cours de lecture:
  2045.      * Init importante pour ne pas planter le display par groupes.
  2046.      */
  2047.     pVoie_curr -> pOutputFPar_CurrOut = NULL;
  2048.     pVoie_curr -> curr_comprec = NULL;
  2049.     /*
  2050.      * Pas encore d'enregistrement cr‚‚ … partir de cette page arbo 
  2051.      */
  2052.     pVoie_curr -> nb_records = 0;            
  2053.  
  2054.     /*
  2055.      * Cr‚ation de la liste des champs d'‚dition 
  2056.      * de cette page pour cette voie
  2057.      */
  2058.     Create_ArboPageInFieldList( pVoie_curr );
  2059.     
  2060.     /*
  2061.      * R‚cup‚ration des paramŠtres transmis par la page pr‚c‚dente:
  2062.      */
  2063.     pVoie_curr -> pDataPage_LockedDB_IN    = pVoie_curr -> pDataPage_LockedDB_OUT;
  2064.     pVoie_curr -> pDataPage_LockedDB_OUT= NULL;        /* Pas encore de param pour la page suivante */
  2065.  
  2066.     pVoie_curr -> pCompRec_Locked_IN     = pVoie_curr -> pCompRec_Locked_OUT;
  2067.     pVoie_curr -> pCompRec_Locked_OUT     = NULL;        /* Pas encore de param pour la page suivante */
  2068.     if( pVoie_curr -> pCompRec_Locked_IN )
  2069.     {    /*
  2070.          * Si on a re‡u un Compact Record en param de la page pr‚c‚dente:
  2071.          * Il faut le mettre dans la liste des readlocks pour ne pas oublier
  2072.          * de le lib‚rer lorsqu'on quitte cette page:
  2073.          */ 
  2074.         DBInt_AddLockToList( pVoie_curr, pVoie_curr -> pCompRec_Locked_IN );
  2075.     }
  2076.     
  2077.     /*
  2078.      * Effectue op‚rations n‚cessaires … l'entr‚e sur la page 
  2079.      */
  2080.     switch( n_PgFnct )
  2081.     {    /*
  2082.          * Selon la fonction de la page arbo: 
  2083.          */
  2084.         case    FA_ECRI_MSG:    
  2085.             /*
  2086.              * Ouvre base de donn‚es
  2087.              */
  2088.             EcriMsg_ENPG( pVoie_curr ); 
  2089.             break;
  2090.  
  2091.         case    FA_LECT_MSG:
  2092.             /*
  2093.              * Lecture message:
  2094.              */
  2095.             LectMsg_ENPG( pVoie_curr );
  2096.             break;
  2097.  
  2098.         case    FA_DISP_TEXT:
  2099.             /*
  2100.              * Affichage d'un texte:
  2101.              */
  2102.             DispText_ENPG( pVoie_curr );
  2103.             break;
  2104.  
  2105.         case    FA_ID:
  2106.         case    FA_NEW_ACCOUNT:    
  2107.             /*
  2108.              * Identification,
  2109.              * creation d'un compte:
  2110.              * Ouvre base de donn‚es
  2111.              */
  2112.             register_action( pVoie_curr, OPDB, FB_DIRECTORY, 0, NULL ); 
  2113.             break;
  2114.  
  2115.         case    FA_LIST:
  2116.             /*
  2117.              * Liste des messages d'une rub
  2118.              * (liste d'une DB):
  2119.              */
  2120.             ListDB_ENPG( pVoie_curr, FB_RUB );
  2121.             break;
  2122.  
  2123.         case    FA_DIRECTORY:
  2124.             /*
  2125.              * annuaire des comptes
  2126.              * (liste d'une DB):
  2127.              */
  2128.             ListDB_ENPG( pVoie_curr, FB_DIRECTORY );
  2129.             break;
  2130.  
  2131.         case    FA_FILESEL:
  2132.             /*
  2133.              * S‚lecteur de fichier:
  2134.              */
  2135.             FileSel_ENPG( pVoie_curr );
  2136.             break;
  2137.  
  2138.         case    FA_DOWNLOAD:
  2139.             /*
  2140.              * Download d'un ou plusieurs fichiers:
  2141.              */
  2142.             return    DownLoad_ENPG( pVoie_curr );
  2143.             
  2144.         /* case    FA_MENU: */ 
  2145.         /* default: */
  2146.     }
  2147.     
  2148.     if( n_PgFnct != FA_DOWNLOAD )
  2149.     {    /*
  2150.           * On se place sur le premier champ de saisie disponible:
  2151.           * puis place dans l'Etat WAIT
  2152.           */
  2153.         Move_FocusToFirstInField( pVoie_curr );
  2154.     }
  2155.     
  2156.     return    FALSE0;
  2157. }
  2158.  
  2159.  
  2160. /*
  2161.  * register_action(-)
  2162.  *
  2163.  * Purpose:
  2164.  * --------
  2165.  * Enregistre une action a effectuer 
  2166.  * dans la pile FIFO de la voie courante
  2167.  *
  2168.  * History:
  2169.  * --------
  2170.  * 1993: fplanque: Created
  2171.  * 05.01.95: accepte paramŠtres
  2172.  */
  2173. void    register_action( 
  2174.             VOIE *    pVoie_curr,     /* In: Voie concern‚e */
  2175.             int         action,            /* In: No de l'action */
  2176.             int        int1,                /* In: Params int */
  2177.             ULONG        ulong1,            /* In: Params ULONG */
  2178.             void *    ptr1     )            /* In: Params PTR */
  2179. {
  2180.     int    action_tail = pVoie_curr -> action_tail;
  2181.  
  2182.     /*
  2183.      * Incr‚mente la queue de la pile FIFO: 
  2184.      */
  2185.     if ( action_tail == NB_ACTS_MAX-1 )
  2186.     {
  2187.         action_tail = 0;
  2188.     }
  2189.     else
  2190.     {
  2191.         action_tail ++;
  2192.     }
  2193.     
  2194.     if( action_tail + 1 == pVoie_curr -> action_head )
  2195.     {    /*
  2196.          * Si on s'est mordu la queue: 
  2197.          */
  2198.         signale("Les actions se mordent la queue");
  2199.         /*
  2200.          * On ne sauve pas la nlle position!!! 
  2201.          */
  2202.     }
  2203.     else
  2204.     {    /*
  2205.          * Si on peut enregistrer la requete: 
  2206.          * Enregistre l'action dans le tableau:
  2207.          */
  2208.         ACTION * pAction    = &( pVoie_curr -> action[ action_tail ] );
  2209.         pAction -> no        = action;
  2210.         pAction -> int1    = int1;
  2211.         pAction -> ulong1    = ulong1;
  2212.         pAction -> ptr1    = ptr1;
  2213.  
  2214.         /*
  2215.          * Sauve index de la queue: 
  2216.          */
  2217.         pVoie_curr -> action_tail = action_tail;
  2218.     }
  2219.  
  2220. }
  2221.  
  2222.  
  2223.  
  2224.  
  2225.  
  2226. /*
  2227.  * try_connection(-)
  2228.  *
  2229.  * Purpose:
  2230.  * --------
  2231.  * Essaie d'‚tablir une connexion: envoi de porteuse etc...
  2232.  *
  2233.  * History:
  2234.  * --------
  2235.  * 1993: fplanque: Created
  2236.  */
  2237. #if ACCEPT_REMOTE
  2238. void    try_connection( VOIE * pVoie_curr )
  2239. {
  2240.     /*
  2241.      * Signale d‚but proc‚dure de connexion … l'‚cran: 
  2242.      */
  2243.     add_textinf( pVoie_curr -> wi_params, "  Connexion en cours" );
  2244.  
  2245.     /*
  2246.      * Allume le minitel (M2):
  2247.      */
  2248.     allume_minitel( pVoie_curr -> device );
  2249.  
  2250.     /*
  2251.      * Adapte la vitesse:
  2252.      * Passe en 1200 bps
  2253.      */                                
  2254.     Voie_LineSpeed( pVoie_curr );
  2255.                             
  2256.     /*
  2257.      * Envoi de porteuse: 
  2258.      */
  2259.     envoi_porteuse( pVoie_curr -> device );
  2260.  
  2261.     /*
  2262.      * D‚termine heure timeout accord‚e aux acquitements: 
  2263.      */
  2264.     pVoie_curr -> acq_timeout = clock( ) + ACQ_TIMEOUT;
  2265.     /*
  2266.      * D‚termine heure timeout pour la connexion: 
  2267.      */
  2268.     pVoie_curr -> key_timeout = clock( ) + CNCT_TIMEOUT;
  2269.  
  2270.     /*
  2271.      * Connexion en cours: 
  2272.      */
  2273.     pVoie_curr -> action_progress = APG_CNXSTART;        /* D‚but proc‚dure de connexion */
  2274.     register_action( pVoie_curr, CNCT, 0, 0, NULL );    /* Demande d'attendre ACQs de connexion */
  2275. }
  2276. #endif
  2277.  
  2278.  
  2279.  
  2280. /*
  2281.  * enter_dir(-)
  2282.  *
  2283.  * Purpose:
  2284.  * --------
  2285.  * Entre dans un nouveau dossier arbo
  2286.  *
  2287.  * History:
  2288.  * --------
  2289.  * fplanque: Created
  2290.  */
  2291. int    enter_dir( VOIE *pVoie_curr, DATADIR *new_arbodir )
  2292. {
  2293.     int    success;
  2294.     
  2295.     if ( new_arbodir != NULL )
  2296.     {    /* 
  2297.          * Si on peut entrer dans le nouveau dossier: 
  2298.          */
  2299.         pVoie_curr -> arbodir =  new_arbodir;
  2300.  
  2301.         /*
  2302.          * Affiche fonction: 
  2303.          */
  2304.         add_textinf( pVoie_curr -> wi_params, " PremiŠre page arbo: " );
  2305.  
  2306.         /*
  2307.          * Saute … la premiŠre page: 
  2308.          * Saut obligatoire:
  2309.          */
  2310.         success = jmp_page( pVoie_curr, ((new_arbodir -> dir_spec) -> liens_in)[0] .psz_DestPage, TRUE_1 ); 
  2311.  
  2312.         return    success;        /* signale succŠs ou ‚chec de l'op‚ration */
  2313.     }
  2314.     else
  2315.     {    /*
  2316.          * Dossier n'existe pas: 
  2317.          */
  2318.         ping();
  2319.         add_textinf( pVoie_curr -> wi_params, "ERREUR: Dossier vierge!" );
  2320.  
  2321.         return    TRUE_1;        /* Break! */
  2322.     }
  2323.  
  2324. }
  2325.  
  2326.  
  2327.  
  2328. /*
  2329.  * jmp_page(-)
  2330.  *
  2331.  * Purpose:
  2332.  * --------
  2333.  * Saut … une nouvelle page arbo
  2334.  *
  2335.  * History:
  2336.  * --------
  2337.  * 1993: fplanque: Created
  2338.  * 13.11.94: Les initialisations de d‚but de page sont report‚es au curraction ENPG
  2339.  * 29.03.95: n'efface plus le curseur, ‡a devrait d‚j… etre fait!
  2340.  */
  2341. int    jmp_page( 
  2342.             VOIE *    pVoie_curr, 
  2343.             char *    new_arbo, 
  2344.             int         obligatoire )
  2345. {
  2346.     /*
  2347.      * Teste si la page est d‚finie: 
  2348.      */
  2349.     if( new_arbo != NULL )
  2350.     {    /*
  2351.          * Si la page a ‚t‚ d‚finie: 
  2352.          */
  2353.         DATAPAGE    *curr_arbopage;        /* Page arbo courante */
  2354.  
  2355.         /*
  2356.          * Affiche nom de la page: 
  2357.          */
  2358.         complete_textinf( pVoie_curr -> wi_params, new_arbo );
  2359.  
  2360.         /*
  2361.          * Cherche l'adresse de la page: 
  2362.          */
  2363.         curr_arbopage = page_adr_bynamecmp( pVoie_curr -> arbodir, new_arbo );
  2364.         if( curr_arbopage != NULL )
  2365.         {    /*
  2366.              * Si on a trouv‚ la page: 
  2367.              * Affichage commentaire: 
  2368.              */
  2369.             if ( curr_arbopage -> comment != NULL )
  2370.             {    /*
  2371.                  * S'il y a un commentaire: 
  2372.                  */
  2373.                 strcpy( G_tmp_buffer, " = "  );
  2374.                 strcat( G_tmp_buffer, curr_arbopage -> comment );
  2375.                 complete_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  2376.             }
  2377.  
  2378.             /*
  2379.              * Fixe r‚f‚rences ds les paramŠtres de la voie courante: 
  2380.              */
  2381.             pVoie_curr -> arbopage = curr_arbopage;    
  2382.             pVoie_curr -> arboparams = curr_arbopage -> data.pagearbo;
  2383.  
  2384.             /*
  2385.              * Liste des actions … accomplir: 
  2386.              */
  2387.             register_action( pVoie_curr, DISP, FE_FOND, 0, NULL );        /* On va afficher */
  2388.  
  2389.             register_action( pVoie_curr, ENPG, 0, 0, NULL );         /* Initialisation ENTER PAGE */
  2390.         
  2391.             return    RAS0;            /* OK */
  2392.         }
  2393.         else
  2394.         {    /*
  2395.              * Si page introuv‚e: 
  2396.              */
  2397.             ping();
  2398.             add_textinf( pVoie_curr -> wi_params, "ERREUR: Page ARBO introuvable!" );
  2399.     
  2400.             return    ERROR_1;        /* Break! */
  2401.         }
  2402.     }
  2403.     else
  2404.     {    /*
  2405.          * Si la page n'est pas d‚finie (NULL ptr): 
  2406.          */
  2407.         if( obligatoire )
  2408.         {    /*
  2409.              * S'il est obligatoire de se rendre sur cette page: 
  2410.              */
  2411.             ping();
  2412.             add_textinf( pVoie_curr -> wi_params, "ERREUR: Page ARBO non d‚finie!" );
  2413.  
  2414.             return    ERROR_1;        /* Break! */
  2415.         }
  2416.         else
  2417.         {    /*
  2418.              * Pas obligatoire:
  2419.              */
  2420.             /*            csr_on( pVoie_curr -> device ); */
  2421.             return    ABORT_2;        /* ABORT */
  2422.         }
  2423.     }
  2424. }
  2425.  
  2426.  
  2427.  
  2428. /*
  2429.  * affiche_ecran(-)
  2430.  *
  2431.  * Purpose:
  2432.  * --------
  2433.  * Affiche une page ‚cran sur la voie d‚sir‚e
  2434.  *
  2435.  * History:
  2436.  * --------
  2437.  * 1993: fplanque: Created
  2438.  * 11.12.94: fplanque: Chang‚ affichages; le fait que la fonction n'apparisse pas ds page arbo ne stopppe plus le serveur
  2439.  */
  2440. int    affiche_ecran(                 /* Out: S'est-il produit une fatal error */
  2441.             VOIE *    pVoie_curr,     /* In:  Voie concern‚e */
  2442.             int         fnct_ecran )    /* In:  Fonction de la page … afficher */
  2443. {
  2444.     PAGEARBO         *curr_arboparams = pVoie_curr -> arboparams;
  2445.     ARBO_TEXTPAR    *page_ecran = curr_arboparams -> pages_ecran;    /* Ptr sur 1Šre page ‚cran */
  2446.  
  2447.     /*
  2448.      * Cherche la page qui nous int‚resse: 
  2449.      */
  2450.     while( page_ecran != NULL )
  2451.     {
  2452.         if ( page_ecran -> fnct_no == fnct_ecran )
  2453.         {    /*
  2454.              * On a trouv‚ la fonction recherch‚e: 
  2455.              */
  2456.             char        *pecran_nom = page_ecran -> nom;    /* Nom de la page … chercher */
  2457.             DATAPAGE    *page_ecran;                            /* Adr de la page trouv‚e */
  2458.  
  2459.             /*
  2460.              * Teste si on lui a associ‚ une page ‚cran ou si on a pr‚f‚r‚ ne rien afficher: 
  2461.              */
  2462.             if ( pecran_nom == NULL )
  2463.             {    /*
  2464.                  * On a pas voulu afficher de page ‚cran pour cette fonction ‚cran: 
  2465.                  */
  2466.                 return    RAS0;
  2467.             }
  2468.  
  2469.             /*
  2470.              * On a d‚fini une page-‚cran: 
  2471.              */
  2472.  
  2473.             /*
  2474.              * Affiche le nom: 
  2475.              */
  2476.             sprintf( G_tmp_buffer, "  Affiche page-‚cran: %s", pecran_nom );
  2477.             add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  2478.  
  2479.             /*
  2480.              * Cherche cette page: 
  2481.              */
  2482.             page_ecran = page_adr_bynamecmp( pVoie_curr -> pecrandir, pecran_nom );
  2483.             if ( page_ecran != NULL )
  2484.             {    /*
  2485.                  * On a trouv‚ la page ‚cran: 
  2486.                  * Affiche la page: 
  2487.                  */
  2488.                 DATABLOCK * pDataBlock_pecran = page_ecran -> data.dataBlock;
  2489.                 sconout( pVoie_curr -> device , pDataBlock_pecran -> ul_length, pDataBlock_pecran -> p_block );
  2490.                 return    RAS0;
  2491.             }
  2492.             else
  2493.             {    /*
  2494.                  * Page introuvable: 
  2495.                  */
  2496.                 ping();
  2497.                 add_textinf( pVoie_curr -> wi_params, "ERREUR: Page-‚cran introuvable!" );
  2498.  
  2499.                 return    RAS0;
  2500.             }
  2501.             
  2502.         }
  2503.  
  2504.         /*
  2505.          * Passe … la fonction/page ‚cran suivante: 
  2506.          */
  2507.         page_ecran = page_ecran -> next;
  2508.     }
  2509.     
  2510.     /*
  2511.      * On n'a pas trouv‚ l'entr‚e d‚sir‚e dans la liste des pages ‚cran: 
  2512.      */
  2513.     /* ping(); */
  2514.     /* add_textinf( pVoie_curr -> wi_params, "WARNING: Fonction ‚cran non pr‚sente ds page!" ); */
  2515.     /* return    TRUE_1;        /* Break! */ 
  2516.     
  2517.     return    RAS0;
  2518. }
  2519.  
  2520.  
  2521.  
  2522. /*
  2523.  * Serv_EnterDataPage(-)
  2524.  *
  2525.  * Purpose:
  2526.  * --------
  2527.  * Entre dans une base de donn‚es ou un texte
  2528.  *
  2529.  * History:
  2530.  * --------
  2531.  * 1993: fplanque: Created
  2532.  * 05.12.94: 1ere prise en compte de FB_DIRECTORY
  2533.  * 05.01.94: recherche un objet avec une fonction bien pr‚cise
  2534.  * 05.01.94: GŠre aussi les textes
  2535.  */
  2536. int    Serv_EnterDataPage( 
  2537.             VOIE     *    pVoie_curr,        /* In: Voie concern‚e */
  2538.             DATATYPE    DataType,        /* In: Type de donn‚es … charger */
  2539.             int        n_fnct )            /* In: Fonction Recherch‚e */
  2540. {
  2541.     PAGEARBO      *    curr_arboparams = pVoie_curr -> arboparams;
  2542.     ARBO_TEXTPAR *    pTextPar_Data = curr_arboparams -> databases;    /* Ptr sur 1Šre base de donn‚es */
  2543.     DATADIR         *    pDataDir = NULL;
  2544.     const char     * cpsz_Error = NULL;
  2545.  
  2546.     switch( DataType )
  2547.     {
  2548.         case    DTYP_DATAS:
  2549.             add_textinf( pVoie_curr -> wi_params, "  Ouvre base de donn‚es: " );
  2550.             pDataDir = pVoie_curr -> pDataDir_Datas;
  2551.             cpsz_Error =  "ERREUR: Base de donn‚es introuvable!" ;
  2552.             break;
  2553.         
  2554.         case    DTYP_TEXTS:
  2555.             add_textinf( pVoie_curr -> wi_params, "  Ouvre texte: " );
  2556.             pDataDir = pVoie_curr -> pDataDir_Texts;
  2557.             cpsz_Error =  "ERREUR: Texte introuvable!"; 
  2558.             break;
  2559.  
  2560.         default:
  2561.             signale( "Ne sait pas ouvrir ces donn‚es." );
  2562.     }
  2563.     
  2564.     /*
  2565.      * Cherche la DataPage qui nous int‚resse: 
  2566.      */
  2567.     while( pTextPar_Data != NULL )
  2568.     {
  2569.         if( pTextPar_Data -> fnct_no == n_fnct )
  2570.         {    /*
  2571.              * On a trouv‚ la fonction recherch‚e: 
  2572.              */
  2573.             char    *    psz_DataName = pTextPar_Data -> nom;        /* Nom de la page … chercher */
  2574.  
  2575.             /*
  2576.              * Teste si on a associ‚ un fichier de donn‚es: 
  2577.              */
  2578.             if( psz_DataName != NULL )
  2579.             {    /*
  2580.                  * On a d‚fini un objet de donn‚es: 
  2581.                  */
  2582.                 DATAPAGE    *    pDataPage;                    /* Adr de la base trouv‚e */
  2583.  
  2584.                 /*
  2585.                  * Affiche le nom: 
  2586.                  */
  2587.                 complete_textinf( pVoie_curr -> wi_params, psz_DataName );
  2588.  
  2589.                 /*
  2590.                  * Cherche cette page: 
  2591.                  */
  2592.                 pDataPage = page_adr_bynamecmp( pDataDir, psz_DataName );
  2593.  
  2594.                 /*
  2595.                  * Sauve ptr sur la datapage trouv‚e:
  2596.                  */
  2597.                 switch( DataType )
  2598.                 {
  2599.                     case    DTYP_DATAS:
  2600.                         pVoie_curr -> database = pDataPage;
  2601.                         break;
  2602.                         
  2603.                     case    DTYP_TEXTS:
  2604.                         pVoie_curr -> pDataPage_OpenText = pDataPage;
  2605.                 }
  2606.  
  2607.                 /*
  2608.                  * Teste si on a trouv‚ la page: 
  2609.                  */
  2610.                 if( pDataPage != NULL )
  2611.                 {    /*
  2612.                      * On a trouv‚ la base de donn‚es: 
  2613.                      */
  2614.                     return    RAS0;
  2615.                 }
  2616.             }
  2617.             /*
  2618.              * Impossible d'ouvrir:
  2619.              */
  2620.             ping();
  2621.             add_textinf( pVoie_curr -> wi_params, cpsz_Error );
  2622.  
  2623.             return    TRUE_1;        /* Break! */
  2624.         }
  2625.  
  2626.         /*
  2627.          * Passe … la fonction/page ‚cran suivante: 
  2628.          */
  2629.         pTextPar_Data = pTextPar_Data -> next;
  2630.     }
  2631.     
  2632.     /*
  2633.      * On n'a pas trouv‚ la page: 
  2634.      */
  2635.     ping();
  2636.     add_textinf( pVoie_curr -> wi_params, "SYSERROR: Fonction DB introuvable!" );
  2637.  
  2638.     return    TRUE_1;        /* Break! */
  2639. }
  2640.  
  2641.  
  2642.  
  2643. /*
  2644.  * place_csr(-)
  2645.  *
  2646.  * Purpose:
  2647.  * --------
  2648.  * Place le curseur sur champ de saisie courant … l'‚cran
  2649.  * pour la voie d‚sir‚e
  2650.  *
  2651.  * History:
  2652.  * --------
  2653.  * 1993: fplanque: Created
  2654.  * 21.08.94: on se positionne maintenant dans pIOField_CurrIn
  2655.  */
  2656. void    place_csr( 
  2657.             VOIE *    pVoie_curr )
  2658. {
  2659.     /*
  2660.      * Variables: 
  2661.      */
  2662.     IOFIELD    *    pInField = pVoie_curr -> pIOField_CurrIn;
  2663.     int            device    = pVoie_curr -> device;        /* Port utilis‚ */
  2664.     int            n_col_text;
  2665.  
  2666.     if( pInField == NULL )
  2667.     {
  2668.         return;
  2669.     }
  2670.     
  2671.     /*
  2672.      * S'il y a un champ d'‚dition courant: 
  2673.      */
  2674.     n_col_text = pInField -> FPar.Input -> col_text;
  2675.  
  2676.     /*
  2677.      * Positionne le curseur: 
  2678.      */
  2679.     pos( device, pVoie_curr -> csr_x, pVoie_curr -> csr_y );
  2680.  
  2681.     /*
  2682.      * Fixe couleur texte: 
  2683.      */
  2684.     set_tcolor( device, n_col_text  );            /* Couleur texte */
  2685.     pVoie_curr -> curr_tcolor = n_col_text;    /* M‚morise couleur texte actuellement utilis‚e */
  2686.  
  2687.     /*
  2688.      * Affiche curseur 
  2689.      */
  2690.     csr_on( device );            
  2691. }
  2692.  
  2693.  
  2694.  
  2695. /*
  2696.  * affiche_touche(-)
  2697.  *
  2698.  * Purpose:
  2699.  * --------
  2700.  * Affichage de la touche press‚e 
  2701.  * ou de l'‚vŠnement survenu dans la fenetre LOG
  2702.  *
  2703.  * History:
  2704.  * --------
  2705.  * 1993: fplanque: Created
  2706.  */
  2707. void    affiche_touche( VOIE *pVoie_curr, KEYCODE code_touche )
  2708. {
  2709.     /* 
  2710.      * Affiche le nom de la touche: 
  2711.      */
  2712.     if ( code_touche < ACTIONS )
  2713.     {    /* 
  2714.          * S'il s'agit d'une touche: 
  2715.          */
  2716.         sprintf( G_tmp_buffer, "  Touche: %s", M_keyname[ code_touche ] );
  2717.         add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  2718.     }
  2719.     else
  2720.     {    /*
  2721.         * S'il s'agit d'une action/‚vennement: 
  2722.         */
  2723.         add_textinf( pVoie_curr -> wi_params, M_keyname[ code_touche ] );
  2724.     }
  2725. }
  2726.  
  2727.  
  2728.  
  2729.  
  2730. /*
  2731.  * sys_events(-)
  2732.  *
  2733.  * Purpose:
  2734.  * --------
  2735.  * Gestion des actions sysop sur l'ordinateur pdt la gestion du serveur
  2736.  *
  2737.  * History:
  2738.  * --------
  2739.  * 1993: fplanque: Created
  2740.  */
  2741. int    sys_events( void )
  2742. {
  2743.     int    event;    /* EvŠnement qui s'est produit */
  2744.  
  2745.     /*
  2746.      * Teste ‚vŠnement GEM: 
  2747.      */
  2748.     event=evnt_multi( MU_TIMER | MU_MESAG | MU_BUTTON | MU_KEYBD,
  2749.                             2, 1, 1,
  2750.                      0, 0, 0, 0, 0, 
  2751.                      0, 0, 0, 0, 0,
  2752.                      G_ev_mgpbuff, 
  2753.                      0, 0,
  2754.                      &G_mouse_x, &G_mouse_y, &G_mouse_button,
  2755.                      &G_kbd_state, &G_kbd_return,
  2756.                      &G_mouse_nbc);
  2757.  
  2758.     if( event & MU_MESAG ) 
  2759.     {    /*
  2760.          * S'il y a un message AES: 
  2761.          */
  2762.         int    msg_type= G_ev_mgpbuff[0];    /* Type de message */
  2763.         int    wi_handle=-1;            /* Handle de la fenˆtre … traiter */
  2764.         WIPARAMS    *wi_params_adr;    /* Adresse des params de la fen concern‚e */
  2765.  
  2766.         if ( msg_type>=WM_REDRAW && msg_type<=WM_NEWTOP ) /* Si event concerne une fenˆtre */
  2767.         {
  2768.             wi_handle= G_ev_mgpbuff[3];    /* Handle de la fenˆtre … traiter */
  2769.             /* printf("Received message for window: handle=%d\n", wi_handle); */
  2770.  
  2771.             wi_params_adr = wi_params ( wi_handle );  /* Adr de la zone de paramŠtres associ‚e */
  2772.             if ( wi_params_adr == NULL )    /* Si la fen concern‚ n'existe pas(plus) */
  2773.                 msg_type = -1;        /* Annule le message: il ne sera pas reconnu par ce qui suit... */                            
  2774.         }
  2775.             
  2776.         switch ( msg_type )
  2777.         {
  2778.  
  2779.             case MN_SELECTED:
  2780.                 ping();                /* Action Interdite! */
  2781.                 break;
  2782.  
  2783.             case WM_REDRAW:
  2784.                 redraw( wi_params_adr, G_ev_mgpbuff[4], G_ev_mgpbuff[5],
  2785.                     G_ev_mgpbuff[6], G_ev_mgpbuff[7], TAKE_CTRL ); /* Effectue un redraw */
  2786.                 break;
  2787.  
  2788.             case WM_TOPPED:
  2789.                 if ( wi_params_adr -> type != TYP_TRACK ) /* S'il ne s'agit pas d'une fenˆtre serveur: */
  2790.                     ping();                /* Action Interdite! */
  2791.                 else    /* S'il s'agit de la fenˆtre serveur: */
  2792.                     /* Ceci ne se produira qu'en environnement multitƒche */
  2793.                     /* ou avec un accessoire (c bien du multi-tache) */
  2794.                     put_wi_on_top( wi_params_adr );    /* Place fen au premier plan */
  2795.                 break;
  2796.  
  2797.             case WM_CLOSED:
  2798.                 if ( wi_params_adr -> type != TYP_TRACK ) /* S'il ne s'agit pas de la fenˆtre serveur: */
  2799.                     ping();                /* Action Interdite! */
  2800.                 else    /* S'il s'agit de la fenˆtre serveur: */
  2801.                     return    TRUE_1;            /* BREAK SERV */
  2802.                 break;
  2803.         
  2804.             case WM_FULLED:
  2805.                 msg_fulled( wi_params_adr );
  2806.                 break;
  2807.                 
  2808.             case WM_ARROWED:
  2809.                 msg_arrowed( wi_params_adr );
  2810.                 break;
  2811.                 
  2812.             case WM_VSLID:
  2813.                 msg_vslid( wi_params_adr );
  2814.                 break;
  2815.  
  2816.             case WM_HSLID:
  2817.                 msg_hslid( wi_params_adr );
  2818.                 break;
  2819.             
  2820.             case WM_SIZED:
  2821.                 msg_sized( wi_params_adr );
  2822.                 break;
  2823.  
  2824.             case WM_MOVED:
  2825.                 msg_moved( wi_params_adr );
  2826.                 break;
  2827.  
  2828.             case WM_NEWTOP:
  2829.                 ping();
  2830.                 /* Cet ‚vŠnement n'arrive jamais... */
  2831.                 /* Au cas ou il arriverait, on remet imm‚diatement une fen serveur au 1er plan: */
  2832.                 put_wi_on_top( G_wi_list_adr );    /* Place fen au premier plan */
  2833.                 break;
  2834.                 
  2835.         }
  2836.  
  2837.     }
  2838.     
  2839.     if( event & MU_TIMER ) 
  2840.     {    /*
  2841.          * EvŠnement Timer:
  2842.          * On ne fait rien:
  2843.          */
  2844.     }
  2845.  
  2846.     if( event & MU_KEYBD ) 
  2847.     {    /*
  2848.          * EvŠnement Keyboard:
  2849.          * On ne fait rien:
  2850.          */
  2851.         /* int    n_ScanCode    = G_kbd_return >> 8; */
  2852.         /*    char    c_car            = G_kbd_return & 0xFF;            */
  2853.  
  2854.         /* printf("\r Scan=%d car=%c ", n_ScanCode, c_car );    */
  2855.     }
  2856.  
  2857.     /*
  2858.      * Pas d'interruption... 
  2859.      */
  2860.     return    FALSE0;    /* Continue normalement */
  2861.  
  2862. }
  2863.  
  2864.  
  2865.